触发器概述.
触发器是一种特殊类型的存储过程。
主要优点.
- 触发器是在某个事件发生时自动激活而执行的。
- 触发器可以实现比约束更为复杂的完整性要求。
- 触发器可以根据表数据修改前后的状态采取相应的措施。
- 触发器可以防止恶意的或错误的
INSERT
、UPDATE
和DELETE
操作。
种类.
- 【DML触发器】是在执行数据操纵语言(DML)事件时被激活而自动执行的触发器。
- 【DDL触发器】是在执行数据定义语言(DDL)事件时被激活而自动执行的触发器。
- 【登录触发器】是由登录(LOGON)事件而激活的触发器。
工作原理.
SQL Server在工作时为每个触发器在服务器的内存上建立两个特殊的表:插入表Inserted
和删除表Deleted
。
- 【INSERT触发器的工作原理】当对表进行
INSERT
操作时,INSERT
触发器被激发,新的数据行被添加到创建触发器的表和Inserted
表。 - 【DELETE触发器的工作原理】对表进行
DELETE
操作时,DELETE
触发器被激发,系统从被影响的表中将删除的行放入Deleted
表中。 - 【UPDATE触发器的工作原理】当执行
UPDATE
操作时,UPDATE
触发器被激活。触发器将原始行移入Deleted
表中,把更新行插入到Inserted
表中。
创建触发器.
创建DML触发器.
CREATE TRIGGER trigger_name
ON {
table | view}
[With Encryption]
{
For | After | Instead Of}
{
[ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE] }
AS sql_statement [;]
- 第1行使用
CREATE TRIGGER
来创建一个触发器; - 第2行指明触发器是施加在表
Table
还是视图View
上,注意视图上只能创建Instead of
触发器,而不能创建For|After
触发器; - 第3行说明是否加密;
- 第4行的
For
和After
都表示在第5行的操作过后,执行触发器的动作,而Instead of
表示跳过第5行的语句,直接执行触发器动作; - 第5行是指出能够激活触发器的条件,必须至少包含一个操作;
- 第6行就是具体的触发器动作。
【例】设计一个触发器,在学生表S中删除某一个学生时,在选课表SC中该学生的选课记录也全部被删除。
USE Teach
GO
CREATE TRIGGER del_S
ON S
AFTER DELETE
AS
DELETE
FROM SC
WHERE SC.SNo IN(SELECT SNo FROM Deleted)
GO
创建DDL触发器.
CREATE TRIGGER trigger_name
ON {
All Server | Database}
[With Encryption]
{
FOR | AFTER} {
event_type | event_group } [,...n ]
AS sql_statement [; ]
- 第1行创建触发器;
- 第2行指明触发器是施加在当前服务器
All Server
还是当前数据库Database
,前者的效果是使得触发器作用域为当前服务器,即整个服务器的任何位置上出现了后面指定的event_type|event_group
,就会激活该触发器;后者的效果是使得作用域为当前数据库; - 第3行说明是否加密;
- 第4行的
For
和After
都表示在第5行的操作过后,执行触发器的动作,后面的两个参数,event_type
是指激活触发器的T-SQL语言事件的名称,例如CREATE_TABLE|DROP_TABLE|ALTER_TABLE
等;后者是预定义的T-SQL语言事件分组的名称,执行属于event_group
的T-SQL语言事件之后,都将激活该触发器; - 第5行就是具体的触发器动作。
【例】创建一个DDL触发器safety,禁止修改和删除当前数据库中的任何表。
USE Teach
GO
CREATE TRIGGER safety
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS PRINT '不能删除或修改数据库表!'
ROLLBACK
GO
禁用触发器.
在有些情况下,用户希望暂停触发器的作用,但并不删除它,这时就可以通过DISABLE TRIGGER
语句使触发器无效,语法格式如下:
DISABLE TRIGGER {
[ schema_name.] trigger_name [ ,...n ] | ALL }
ON object_name
- 【schema_name】触发器所属架构的名称;
- 【ALL】指明禁用在
ON
子句作用域中定义的所有触发器; - 【object_name】在其上创建的DML触发器的对象名称。
【例】将上面创建在数据库上的触发器safety
禁用并进行验证。
//A temporary table TS.
SELECT * INTO TS
FROM S
//Try to delete TS,but fail because of trigger 'safety'.
DROP TABLE TS
//Disable 'safety'.
GO
DISABLE TRIGGER safety
ON DATABASE
//Success to delete TS.
DROP TABLE TS
GO
解禁触发器.
要使触发器重新有效,可使用ENABLE TRIGGER
语句,语法格式如下:
ENABLE TRIGGER {
[schema_name.] trigger_name[ ,...n ] | ALL }
ON object name
删除触发器.
使用DROP TRIGGER
语句删除触发器.
DROP TRIGGER trigger_name