SQL server触发器

前言:

触发器与存储过程有一点点差别的,那么我们什么时候要用触发器,接下来将给大家揭晓!

在这里插入图片描述

1、什么是触发器

触发器是一个在修改指定表中的数据执行的存储过程。通常通过创建触发器来强制实现 不同表 中的逻辑相关数据的引用完整性或一致性。由于用户不能绕过触发器,所以用来 强制实施复杂的业务规则!以此确保数据的 完整性 !

一开始以为触发器没什么总结的,但是通过系统的学习,发现还是有必要总结一下的,接下来将是几篇触发器的总结博客!

2、为什么要使用触发器

(1)触发器自动执行,他们在表的数据做了任何修改,之后立即激活!(和事件差不多了)
(2)触发器可以通过数据库中的相关表进行层叠更改,这直接把代码写在客户端更加合理!
(3)触发器的限制可以引用到其它表中的列!

3、触发器如何保证数据的完整性

个人理解:比如我们做牛腩新闻系统的时候,如果我们删除了一条新闻,那么删除这条新闻的时候,它下面的新闻的评论也随之删除,此时涉及到两个表,一个是新闻表,一个是评论表!如果没有触发器的话,我们在程序中还要加上删除新闻评论表中的对应的内容!但是有时候程序员万一要是忘记设计删除新闻评论类,那么数据就不完整了!(新闻表中没有了此类新闻,但是评论表中却有此类新闻的评论!)

4、触发器的种类

我们之前设计的触发器好像都是DML的,但是还有DDL,那么二者之间有何区别呢!

DML触发器(修改表中的数据用)
DML(Data Manipulation Language)触发器是当数据库中发生数据操作语言事件要执行的操作。它通常包含三种:INSERT触发器,UPDATE触发器,DELETE触发器!当我们要对 数据库里的数据 进行操作的时候,我们要用到DML触发器!

DDL触发器(修改表)
DDL触发器是当数据库中发生数据定义语言(Data Definition Language)主要包括CREATE,ALTER,DROP等操作!当我们用在 定义或者改变表的结构,数据类型,表之间的连接和约束的时候,我们就用DDL触发器!

触发器保证了我们数据库数据的完整性,DDL是修改表的层次,DML是修改表中的数据层次!

5、触发器类型 FOR 、AFTER、 Instead of到底是什么

由于FOR触发器与AFTER触发器是一个作用,所以触发器分为AFTER触发器,与Instead of 触发器!

为了让大家明白触发器,我先把我的数据库是干嘛的给大家介绍一下吧,我的数据库是一个新闻发系统对应的数据库 ,里边有两个表一个是新闻类别表caregory ,还有一个是新闻表news,其中一条类新闻对应多条新闻,但是一条新闻只是属于一类!故有下图!其中news表的主键为id,外键为caID,与care gory的主键相对,此时通过主外键将两个表连接起来!

在这里插入图片描述

接下来我们要完成的操作是删除表中一条新闻类别信息,我们此时建立一条delete触发器,通过这个触发器我们来了解一下AFTER触发器与instead of 触发器之间到底有何区别!

6、AFTER(for)触发器 (操作后)

after触发器是指在操作成功后,所采取的一些动作!

比如:下面是我创建好的一个after触发器

<span style="color:#000000"><code>SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
creat trigger [dbo].[T_CaregoryDelete]          --触发器的名字为T_CaregoryDelete
on [dbo].[caregory]                                         --是caregory类别表的触发器
after delete                                                     --after代表执行删除后执行as后边的语句
as
  begin
	delete news where caId=(select id from deleted)      --激发触发器后我要执行的动作,其中deleted是一个系统默认临时表
  end
</code></span>

接下来我编译代码
delete from caregory where id=4,报了如下的错误!
在这里插入图片描述

刚才我说过了,我们的类别表caregory与新闻表news表是通过主外键连接的,我们在执行语句delete from caregory where id=4的时候我们的news表对应的新闻也应该被删除!如下所示图!

在这里插入图片描述
在这里插入图片描述

但是我们的after触发器只能是在执行完delete操作后执行,如果此时我们执行
delete from caregory where id=4 ,那么我们将我们id信息为4的类别的新闻删除后才可以触发触发器,那么我们的这类新闻下的所有新闻就不能被删除了,这时候我们的表是主外键连接的,所以就报了上述错误!那么这下该怎么办呢,这时候解决instead of 触发器登场!

2、instead of 触发器

对数据的操作只是一个“导火索”而已,真正起作用的是触发器里面的动作;往往这种触发器会有很多分支判断语句在里面,根据不用的条件做不同的动作!

INSTEAD OF 触发器用来代替通常的触发动作,即当对表进行INSERT、UPDATE 或 DELETE 操作时,系统不是直接对表执行这些操作,而是把操作内容交给触发器,让触发器检查所进行的操作是否正确。如正确才进行相应的操作。因此,INSTEAD OF 触发器的动作要早于表的约束处理。

真正起作用的是触发器里面的动作,接下来是对应触发器的代码

<span style="color:#000000"><code>SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER trigger [dbo].[T_CaregoryDelete]
on [dbo].[caregory]
instead of delete
as
  begin
	delete news where caId=(select id from deleted)
	delete caregory where id=(select id from deleted)
  end
</code></span>

此时执行语句delete from caregory where id=4,那么我们就成功的将我们类别表信息删除,同时将我们类别表下对应的这类的新闻页一块删除了!

这里可能有人就有疑问了,算上delete from caregory where id=4 共有三个delete,注意上面我强调了一句话,真正起作用的是触发器里面的动作!

后记:

after触发器是在操作成功后,所采取的一些动作
而对于instead of触发器,真正起作用的是触发器里面的动作!

 

文章转载于:https://blog.csdn.net/jerry11112/article/details/82928739

 

 

### SQL Server 触发器概述 SQL Server中的触发器是一种特殊类型的存储过程,在特定的数据操作事件(如`INSERT`、`UPDATE`或`DELETE`)发生时会自动执行[^3]。触发器的主要用途是维护数据库的一致性完整性。 以下是关于创建使用SQL Server触发器的一些基本概念示例: --- ### 创建Insert类型触发器的语法 创建一个简单的`INSERT`类型触发器,可以在指定表上定义逻辑以响应新记录的插入行为。其基础语法规则如下所示[^1]: ```sql CREATE TRIGGER trg_InsertExample ON target_table AFTER INSERT -- 可替换为FOR UPDATE, FOR DELETE等 AS BEGIN -- 在此编写Transact-SQL代码处理业务需求 END; ``` 上述脚本中指定了触发器名称(`trg_InsertExample`)及其作用的目标表(`target_table`)。通过设置`AFTER INSERT`关键字表明该触发器将在每次向目标表成功插入一条或多条记录之后运行。 --- ### 利用Inserted与Deleted临时表实现复杂逻辑 为了增强触发器的功能并支持更复杂的场景分析,SQL提供了两个内置的虚拟表——`inserted``deleted`。这些表格分别保存了当前事务期间涉及变动前后的原始数据副本[^2]。 #### 示例:防止非法价格更新 假设有一个产品库存管理系统的订单明细表(OrderDetails),其中包含字段OrderID、ProductID及UnitPrice。现在希望构建这样一个规则:如果有人试图降低任何已售商品的价格,则阻止这种更改的发生。 下面展示了一个满足前述条件的设计方案: ```sql -- 创建名为Prevent_Price_Decrease 的Update Trigger CREATE TRIGGER Prevent_Price_Decrease ON OrderDetails INSTEAD OF UPDATE AS BEGIN IF EXISTS ( SELECT * FROM inserted i JOIN deleted d ON i.OrderDetailID=d.OrderDetailID AND i.UnitPrice<d.UnitPrice ) RAISERROR('不允许减少单价', 16 ,1); ELSE IF NOT EXISTS ( SELECT * FROM inserted ) RETURN ; ELSE UPDATE od SET UnitPrice=i.UnitPrice FROM OrderDetails od INNER JOIN inserted i ON od.OrderDetailID =i.OrderDetailID WHERE i.UnitPrice >=d.UnitPrice END; GO ``` 在此例子中运用到了`EXISTS()`函数检测是否存在违反规定的情况;同时利用`JOIN`连接原状态(deleted)同最新提交(inserted)对比差异之处。最后采用`INSTEAD OF`代替默认动作完成定制化控制流程. --- ### 加密触发器提升安全性 有时出于安全考虑可能需要隐藏某些敏感商业逻辑或者保护知识产权不受侵犯。这时可以通过添加选项`WITH ENCRYPTION`来编译加密版本的触发程序体内容: ```sql CREATE TRIGGER SecureTriggerDemo WITH ENCRYPTION ... ``` 这样即使拥有管理员权限也无法轻易查看到实际源码细节除非掌握解密方法论。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值