论文部分内容阅读
[摘要] 本文根据触发器的原理,针对关系数据库,分析了AFTER触发器和INSTEAD OF触发器的设计方法,并通过这两类触发器的创建和应用,实现关系数据库的自定义完整性。同时在完成关系数据库触发器的应用中指出触发器的特点和使用注意事项,以便读者更好的设计使用关系数据库触发器。
[关键词] 关系数据库 触发器 设计和应用
0.引言
关系数据库定义的触发器是一种特殊类型的存储过程,其在特定的表或视图上定义,当表中的数据被修改时,数据库管理系统(如SQL Server)会自动执行触发器。在实际应用中,有时需要根据情况的变化对表中的数据进行修改,对表中的数据进行修改的操作包括INSERT、DELETE、UPDATE操作,如果对某个表的INSERT、DELETE、UPDATE操作定义了触发器,则对该表执行这些操作时,相应的触发器就会被自动执行。使用触发器可以实现更为复杂的数据完整性约束,可以完成使用普通约束无法实现的复杂功能。
1.触发器的特点和类型
1.1 触发器的特点
触发器具有如下特点:
(1)与一个表或视图相联系。触发器在特定的表或视图上定义,这个表或视图称为触发器表或触发器视图。
(2)自动激活。如果对某个表的INSERT、DELETE、UPDATE操作定义了相应的触发器,当对该表进行这些操作时,相应的触发器就会被自动执行。
(3)不能直接调用。与一般的存储过程不同,触发器不能直接调用,也不能传递或接收参数。
(4)是一个事务。触发器和激活它的语句作为一个事务处理,可能从触发器中的任何位置撤消。
1.2触发器的优点
触发器具有如下优点:
(1)触发器可以强制定义比CHECK约束更为复杂的数据完整性约束。在数据库中要实现数据的完整性约束,可以使用CHECK约束或触发器。在CHECK约束中,不允许引用其他表中的列来完成数据的检查工作,而触发器可以引用其他表中的列来完成数据的完整性约束。
(2)触发器可以实现数据库中多个表的级联更改。
(3)触发器可以比较数据库修改前后的数据状态,并根据其差异采取相应的措施。对于由INSERT、DELETE、UPDATE等语句引起的数据变化,触发器可以比较数据变化的前后状态,因此用户可以在触发器中引用由于修改所影响的记录行,并采取相应的措施。
(4)触发器可以使用自定义的错误信息。自定义的错误信息可以指示一个动作的状态,这在应用程序的实现中具有重要的实用价值。通过使用触发器,用户可以捕获破坏数据完整性的操作,并返回预先自定义或动态自定义的错误信息。
1.3 触发器的类型
触发器可以分为AFTER触发器和INSTEAD OF触发器两种。
(1)AFTER触发器。这种类型的触发器在数据变动(INSERT、DELETE、UPDATE操作)完成以后才被触发。AFTER触发器只能在表上定义,每个表可以创建多个AFTER触发器。
(2)INSTEAD OF触发器。这种类型的触发器在数据变动以前被触发,并取代变动数据的操作(INSERT、DELETE、UPDATE操作),即变动数据的操作并不执行,而是执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义,每个表或视图的每个INSERT、DELETE、UPDATE操作只能定义一个INSTEAD OF触发器。
2.触发器的应用
2.1 Inserted表和Deleted表
使用触发器时,SQL Server提供了两个特殊的临时表:Inserted表和Deleted表。这两个表保存在高速缓存中,它们与触发器表具有相同的结构。在进行INSERT、DELETE、UPDATE操作时,系统会根据操作情况来生成这两个表。用户可以使用这两个表来检查某些数据修改的效果,然后可以根据效果采取相应的措施。用户只能查看Inserted表和Deleted表中的数据,而不能直接对它们进行修改。
Inserted表:用于保存触发器表中被插入的记录。
Deleted表:用于保存触发器表中被删除的记录。
执行INSERT操作时,插入到触发器表中的新记录同时被插入到Inserted表中;执行DELETE操作时,从触发器表中删除的记录被插入到Deleted表中;执行UPDATE操作时,等效于从触发器表中删除一条记录,然后再插入一条新记录,因此触发器表中的原记录(被删除的记录)被插入到Deleted表中,修改后的记录(新插入的记录)被插入到Inserted表。
2.2AFTER触发器
如果为表的INSERT、DELETE、UPDATE操作定义了AFTER触发器,则在完成INSERT、DELETE、UPDATE操作后,相应的AFTER触发器才会被激活。这种类型的触发器只能在表上定义,每个表可以创建多个AFTER触发器。
(1)INSERT触发器
INSERT触发器的工作过程如下:
当向触发器表插入数据时,INSERT触发器被激活;
新数据行被插入到触发器表和临时表Inserted中;
执行触发器中定义的语句。
(2)DELETE触发器
DELETE触发器的工作过程如下:
对触发器表执行DELETE操作时,DELETE触发器被激活;
删除触发器表中的记录,并将被删除记录放入临时表Deleted表中;
执行触发器中定义的语句。
(3)UPDATE触发器
UPDATE触发器的工作过程如下:
对触发器表执行UPDATE操作时,UPDATE触发器被激活;
更新触发器表中的记录,并将原始记录放入临时表Deleted中,将更新后的记录放入临时表Inserted表中;
执行触发器中定义的语句。
2.3INSTEAD OF触发器
如果为表或视图的INSERT、DELETE、UPDATE操作定义了INSTEAD OF触发器,则当执行INSERT、DELETE、UPDATE语句时,相应的INSTEAD OF触发器被激活,且触发器定义的操作会取代激活触发器的INSERT、DELETE、UPDATE等操作,即激活触发器的操作并不会被执行。
3.触发器使用注意事项
3.1创建和使用触发器的注意事项
(1)创建触发器的语句CREATE TRIGGER必须为批处理中的第一条语句,且在该批处理中,CREATE TRIGGER语句之后不能有其他的语句,否则SQL会将这些语句作为触发器定义的一部分,因此创建触发器的语句CREATE TRIGGER应作为一个独立的批处理。
(2)触发器不能定义在临时表和系统表中,但是触发器可以引用临时表。
(3)由于TRUNCATE TABLE语句没有日志,因此TRUNCATE TABLE语句不会激活DELETE触发器。
(4)CREATE TRIGGER语句只能在当前数据库中建立触发器,但在触发器内可以引用其他数据库中的数据库对象。
(5)在一个触发器中可以使用各种SET语句设置连接选项,但它们所设置的连接选项只在触发器内有效,当触发器执行之后,各连接选项恢复到触发器激活前的状态值。
(6)触发器的主要用途是检查或修改数据,而不是与用户交互,因此在触发器内不要使用能够返回结果集合的SELECT等语句。
(7)如果在一个触发器内包含有ROLLBACK TRANSACTION语句,则:
如果激活觸发器的语句处于一个用户定义事务之内,触发器内的ROLLBACK TRANSACTION语句执行后将回滚整个事务。
当批处理中的某个语句激活触发器后,将导致批处理中该语句后的所有语句被取消执行。
(8)创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。触发器创建者必须拥有在所受影响表上执行触发器所定义的所有语句的权限,如果触发器中任何部分的T-SQL语句的权限被拒绝,则回滚整个事务。
3.2推荐的触发器实现方案
(1)只在必要时使用触发器,在使用触发器之前应考虑其限制条件。
(2)触发器应尽可能定义得简单。
(3)在递归触发器定义中必须包含递归结束检查,以防止触发器无穷循环。
(4)应尽可能少用ROLLBACK语句,因为在回滚事务时,系统必须取消在该点之前所做的全部动作。
4.结束语
关系数据库中使用触发器可以实现更为复杂的数据完整性约束,可以完成使用普通约束无法实现的复杂功能。触发器可以分为AFTER触发器和INSTEAD OF触发器两种。AFTER触发器在数据变动(INSERT、DELETE、UPDATE操作)完成以后才被触发,这种类型的触发器只能在表上定义,每个表可以创建多个AFTER触发器。INSTEAD OF触发器在数据变动以前被触发,并取代变动数据的操作(INSERT、DELETE、UPDATE操作),即变动数据的操作并不执行,而是执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义,每个表或视图的每个INSERT、DELETE、UPDATE操作只能定义一个INSTEAD OF触发器。
参考文献:
[1]廖辉传.SQL SERVER数据库自动备份软件的实现.华东交通大学学报,2008年2月,第25卷第1期:45—48.
[2]张瑞军、魏继中.基于类触发器数据库同步的汽车衡称重系统.计算机系统应用,2008年第5期:58—61.
[3]张成勇.数据库触发器灵活实现交叉制表.电脑编程技巧与维护,2009年第9期:44—45.
[关键词] 关系数据库 触发器 设计和应用
0.引言
关系数据库定义的触发器是一种特殊类型的存储过程,其在特定的表或视图上定义,当表中的数据被修改时,数据库管理系统(如SQL Server)会自动执行触发器。在实际应用中,有时需要根据情况的变化对表中的数据进行修改,对表中的数据进行修改的操作包括INSERT、DELETE、UPDATE操作,如果对某个表的INSERT、DELETE、UPDATE操作定义了触发器,则对该表执行这些操作时,相应的触发器就会被自动执行。使用触发器可以实现更为复杂的数据完整性约束,可以完成使用普通约束无法实现的复杂功能。
1.触发器的特点和类型
1.1 触发器的特点
触发器具有如下特点:
(1)与一个表或视图相联系。触发器在特定的表或视图上定义,这个表或视图称为触发器表或触发器视图。
(2)自动激活。如果对某个表的INSERT、DELETE、UPDATE操作定义了相应的触发器,当对该表进行这些操作时,相应的触发器就会被自动执行。
(3)不能直接调用。与一般的存储过程不同,触发器不能直接调用,也不能传递或接收参数。
(4)是一个事务。触发器和激活它的语句作为一个事务处理,可能从触发器中的任何位置撤消。
1.2触发器的优点
触发器具有如下优点:
(1)触发器可以强制定义比CHECK约束更为复杂的数据完整性约束。在数据库中要实现数据的完整性约束,可以使用CHECK约束或触发器。在CHECK约束中,不允许引用其他表中的列来完成数据的检查工作,而触发器可以引用其他表中的列来完成数据的完整性约束。
(2)触发器可以实现数据库中多个表的级联更改。
(3)触发器可以比较数据库修改前后的数据状态,并根据其差异采取相应的措施。对于由INSERT、DELETE、UPDATE等语句引起的数据变化,触发器可以比较数据变化的前后状态,因此用户可以在触发器中引用由于修改所影响的记录行,并采取相应的措施。
(4)触发器可以使用自定义的错误信息。自定义的错误信息可以指示一个动作的状态,这在应用程序的实现中具有重要的实用价值。通过使用触发器,用户可以捕获破坏数据完整性的操作,并返回预先自定义或动态自定义的错误信息。
1.3 触发器的类型
触发器可以分为AFTER触发器和INSTEAD OF触发器两种。
(1)AFTER触发器。这种类型的触发器在数据变动(INSERT、DELETE、UPDATE操作)完成以后才被触发。AFTER触发器只能在表上定义,每个表可以创建多个AFTER触发器。
(2)INSTEAD OF触发器。这种类型的触发器在数据变动以前被触发,并取代变动数据的操作(INSERT、DELETE、UPDATE操作),即变动数据的操作并不执行,而是执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义,每个表或视图的每个INSERT、DELETE、UPDATE操作只能定义一个INSTEAD OF触发器。
2.触发器的应用
2.1 Inserted表和Deleted表
使用触发器时,SQL Server提供了两个特殊的临时表:Inserted表和Deleted表。这两个表保存在高速缓存中,它们与触发器表具有相同的结构。在进行INSERT、DELETE、UPDATE操作时,系统会根据操作情况来生成这两个表。用户可以使用这两个表来检查某些数据修改的效果,然后可以根据效果采取相应的措施。用户只能查看Inserted表和Deleted表中的数据,而不能直接对它们进行修改。
Inserted表:用于保存触发器表中被插入的记录。
Deleted表:用于保存触发器表中被删除的记录。
执行INSERT操作时,插入到触发器表中的新记录同时被插入到Inserted表中;执行DELETE操作时,从触发器表中删除的记录被插入到Deleted表中;执行UPDATE操作时,等效于从触发器表中删除一条记录,然后再插入一条新记录,因此触发器表中的原记录(被删除的记录)被插入到Deleted表中,修改后的记录(新插入的记录)被插入到Inserted表。
2.2AFTER触发器
如果为表的INSERT、DELETE、UPDATE操作定义了AFTER触发器,则在完成INSERT、DELETE、UPDATE操作后,相应的AFTER触发器才会被激活。这种类型的触发器只能在表上定义,每个表可以创建多个AFTER触发器。
(1)INSERT触发器
INSERT触发器的工作过程如下:
当向触发器表插入数据时,INSERT触发器被激活;
新数据行被插入到触发器表和临时表Inserted中;
执行触发器中定义的语句。
(2)DELETE触发器
DELETE触发器的工作过程如下:
对触发器表执行DELETE操作时,DELETE触发器被激活;
删除触发器表中的记录,并将被删除记录放入临时表Deleted表中;
执行触发器中定义的语句。
(3)UPDATE触发器
UPDATE触发器的工作过程如下:
对触发器表执行UPDATE操作时,UPDATE触发器被激活;
更新触发器表中的记录,并将原始记录放入临时表Deleted中,将更新后的记录放入临时表Inserted表中;
执行触发器中定义的语句。
2.3INSTEAD OF触发器
如果为表或视图的INSERT、DELETE、UPDATE操作定义了INSTEAD OF触发器,则当执行INSERT、DELETE、UPDATE语句时,相应的INSTEAD OF触发器被激活,且触发器定义的操作会取代激活触发器的INSERT、DELETE、UPDATE等操作,即激活触发器的操作并不会被执行。
3.触发器使用注意事项
3.1创建和使用触发器的注意事项
(1)创建触发器的语句CREATE TRIGGER必须为批处理中的第一条语句,且在该批处理中,CREATE TRIGGER语句之后不能有其他的语句,否则SQL会将这些语句作为触发器定义的一部分,因此创建触发器的语句CREATE TRIGGER应作为一个独立的批处理。
(2)触发器不能定义在临时表和系统表中,但是触发器可以引用临时表。
(3)由于TRUNCATE TABLE语句没有日志,因此TRUNCATE TABLE语句不会激活DELETE触发器。
(4)CREATE TRIGGER语句只能在当前数据库中建立触发器,但在触发器内可以引用其他数据库中的数据库对象。
(5)在一个触发器中可以使用各种SET语句设置连接选项,但它们所设置的连接选项只在触发器内有效,当触发器执行之后,各连接选项恢复到触发器激活前的状态值。
(6)触发器的主要用途是检查或修改数据,而不是与用户交互,因此在触发器内不要使用能够返回结果集合的SELECT等语句。
(7)如果在一个触发器内包含有ROLLBACK TRANSACTION语句,则:
如果激活觸发器的语句处于一个用户定义事务之内,触发器内的ROLLBACK TRANSACTION语句执行后将回滚整个事务。
当批处理中的某个语句激活触发器后,将导致批处理中该语句后的所有语句被取消执行。
(8)创建触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。触发器创建者必须拥有在所受影响表上执行触发器所定义的所有语句的权限,如果触发器中任何部分的T-SQL语句的权限被拒绝,则回滚整个事务。
3.2推荐的触发器实现方案
(1)只在必要时使用触发器,在使用触发器之前应考虑其限制条件。
(2)触发器应尽可能定义得简单。
(3)在递归触发器定义中必须包含递归结束检查,以防止触发器无穷循环。
(4)应尽可能少用ROLLBACK语句,因为在回滚事务时,系统必须取消在该点之前所做的全部动作。
4.结束语
关系数据库中使用触发器可以实现更为复杂的数据完整性约束,可以完成使用普通约束无法实现的复杂功能。触发器可以分为AFTER触发器和INSTEAD OF触发器两种。AFTER触发器在数据变动(INSERT、DELETE、UPDATE操作)完成以后才被触发,这种类型的触发器只能在表上定义,每个表可以创建多个AFTER触发器。INSTEAD OF触发器在数据变动以前被触发,并取代变动数据的操作(INSERT、DELETE、UPDATE操作),即变动数据的操作并不执行,而是执行触发器定义的操作。INSTEAD OF触发器可以在表或视图上定义,每个表或视图的每个INSERT、DELETE、UPDATE操作只能定义一个INSTEAD OF触发器。
参考文献:
[1]廖辉传.SQL SERVER数据库自动备份软件的实现.华东交通大学学报,2008年2月,第25卷第1期:45—48.
[2]张瑞军、魏继中.基于类触发器数据库同步的汽车衡称重系统.计算机系统应用,2008年第5期:58—61.
[3]张成勇.数据库触发器灵活实现交叉制表.电脑编程技巧与维护,2009年第9期:44—45.