
触发器简介:
触发器(触发器)是一种特殊的存储过程,它的执行不被程序调用,并且不需要手动操作,它是由事件触发的,每个人都应该非常熟悉事件,例如按钮单击事件,网页加载事件等. 通过使用鼠标单击按钮来触发按钮的Click事件,并且通过添加,删除和修改表来触发该触发事件. 添加,删除和更新或表(插入,删除,更新)时,将激活触发器.
从SQL2005开始,根据不同的SQL语句将触发器分为两种类型,一种是DML触发器,另一种是DLL触发器. DML触发器分为两类: 触发后和代替触发.
触发器的分类
DML触发器: DML(数据操作语言)触发器是在服务器中发生数据操作语言事件时执行的存储过程. DML触发器分为两类: 触发后和代替触发
DDL触发器: DDL触发器是响应于数据定义语言(数据定义语言)事件而执行的存储过程. DDL触发器通常用于在中执行管理任务. 例如审核和标准化操作,防止表结构被修改等.
DML触发器:
今天,我们主要介绍DML触发器. DML触发器分为After触发器和Not Of触发器.
触发后: 更改记录后(此后),将激活此类型的触发. 它主要用于记录更改后的处理或检查. 一旦发现错误,您也可以使用Rollback Transaction该语句来回滚动此操作.

代替触发器: 这种类型的触发器通常用于替换原始操作. 它发生在记录更改之前. 它不执行原始SQL语句中的操作(插入,更新,删除),而是执行该操作. 触发器本身定义的操作.
代替触发器: 这种类型的触发器通常用于替换原始操作. 它发生在记录更改之前. 它不执行原始SQL语句中的操作(插入,更新,删除),而是执行该操作. 触发器本身定义的动作. 只能在视图上操作
在SQL Server中,每个DML触发器都分配了两个特殊表,一个是插入表,另一个是已删除表. 它们都存在于服务器的内存中,是由系统管理的逻辑表,是两个临时表oracle 触发器,而不是实际存储在中的物理表. 用户仅具有对这两个表的读取权限,而没有修改权限.
这两个表的结构(主外键,字段,数据类型等)与触发器所在的数据表的结构完全相同. 触发器的工作完成后,这两个表也将从内存中删除.
插入表和删除表的作用:
已插入: 对于插入记录操作,要插入的数据存储在插入表中;对于更新记录操作,要更新的记录存储在插入表中.
已删除: 对于更新记录操作,更新后的记录存储在删除表中;对于删除记录操作,已删除的旧记录存储在删除表中.
看上面的两句话可能不太明白,所以看下表了解吗?


工作原理:
After触发器的工作原理:
在执行SQL语句后激活触发器之后. 以删除记录为例: 当SQL Server收到用于删除操作的SQL语句时,SQL Server首先将要删除的记录存储在Deleted表中,然后删除数据表中的记录,然后激活After触发器并执行设备中的After触发器SQL语句. 执行完成后,删除内存中的Deleted表,操作结束.
或以上面的示例为例: 在产品库存表中,如果要删除产品记录,则在删除时,触发器可以检查产品库存数量是否为零,如果不是,则取消删除操作. 的操作如下:
1. 接收SQL语句oracle 触发器,从产品库存表中取出要删除的产品记录,然后将它们放入删除表中.
2. 从产品库存表中删除产品记录.
3. 从删除表中读取产品的库存数量字段,以确定它是否为零. 如果为零,请完成操作并从内存中清除删除表;如果它不为零,则使用Rollback Transaction语句来回滚操作(即将库存表恢复到删除前的状态).
代替触发器起作用:
代替触发器不同于之后触发器. 在完成插入,更新和删除操作之后激活触发器之后,并且在执行这些操作之前激活触发器,并且不再执行原始SQL操作,而是使用触发器本身执行SQL语句而不是原始触发器声明.

以上面的示例为例,在删除产品记录时,将删除操作替换为NOT OF以查询产品的库存. 的操作如下:
1. 接收SQL语句,但不执行它,而是跳转到代替而不是
后面的SQL语句
2,根据收到的产品ID,取出产品库存并完成操作.
讨论了许多理论知识之后,让我们看看如何编写触发代码:
以下代码是触发器的框架.
[sql]
CREATETRIGGERTrigger_Name-触发器名称,触发器名称在中是唯一的. ONTable_Name | View_Name-触发器所在的表或视图. AFTER(FOR)| InsteadOfINSERT,DELETE,UPDATE-定义为AFTER或代替Of类型的触发器. --AFTER与FOR相同. 您不能在视图上定义AFTER触发器. -以下是触发条件. 至少可以张贴一个触发器. 如果有多个以逗号分隔,则不需要顺序. AS--由触发器BEGIN--BEGIN和END执行的操作形成一个代码块,可以写入或不写入. 如果在触发器中执行的SQL语句更复杂,则使用BEGIN和END将使代码更简洁,更易于理解. ENDGO--GO表示结操作已完成
CREATE TRIGGER Trigger_Name --触发器名,在一个中触发器名是唯一的。 ON Table_Name | View_Name --触发器所在的表或者视图。 AFTER(FOR)|Instead Of INSERT,DELETE,UPDATE --定义成AFTER或Instead Of类型的触发器。 --AFTER跟FOR相同,不可在视图上定义AFTER触发器 -- 后面是触发器被触发的条件,最少有一个,可以邮多个。如果有多个用逗号分开,顺序无要求。 AS --触发器要执行的操作 BEGIN --BEGIN跟END组成一个代码块,可以写也可以不写,如果触发器中执行的SQL语句比较复杂,用BEGIN和END会让代码更加整齐,更容易理解。 END GO --GO就代表结操作完毕

注意:
1. After触发器只能用于数据表,而不能用于视图;而不是触发器都可以用于两者,并且不允许建立设置为“带有检查选项”的视图来代替触发器. 两种触发器都不能建立在临时表上.
2. 一个数据表可以有多个触发器,但是一个触发器只能对应一个表.
3. 在同一数据表中,对于每个操作(例如插入,更新,删除),您可以创建许多After触发器,而不是仅为每个操作创建一个触发器.
4. 如果为某个操作设置了After触发器和NOT OF触发器,则将激活Of Of触发器,而不一定要激活After触发器.
5. 不同的SQL语句可以触发相同的触发器. 例如,Insert和Update语句都可以激活相同的触发器.
6. 触发器名称在它所在的中必须是唯一的. 因为触发器在数据表或视图中,所以许认为触发器名称可以相同,只要它在不同的数据表中即可. 实际上,无论触发器位于哪个数据表或视图中,触发器的全名(Server.Database.Owner.TriggerName)必须唯一.
7. 关键字AFTER可以替换为For. 它们都具有相同的含义,这意味着只有在正确完成数据表的操作之后,才会激活触发器.
这里是有关触发器的简要介绍. 如果您有任何不足之处,请告诉我!
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-280083-1.html
来而不往非礼也