1. 触发器:他是一种特殊的存储过程,并且它可以在SQL Server进行某个特定的表修改时由SQL Server自动执行,它还是一种实施完整性约束的手段。它是针对数据表(库)的特殊存储过程,当这个表发生了insert、update或delete操作时,会自动激活执行,可以处理各种复杂的操作。
2. 触发器的作用:
完成比约束更复杂的数据约束;
检查所做的SQL操作是否允许;
修改表里的数据;
调用更多的存储过程;
返回自定义的错误信息;
更改原本要操作的SQL语句;
防止数据表结构更改或数据表被删除。
3. 触发器的两个专用表:inserted表和deleted表(它们为两个逻辑临时表,由系统维护)
4. 触发器的分类:DML触发器(又分为After触发器和Instead Of触发器)、DDL触发器
5. DML触发器是响应INSERT、UPDATE或DELETE语句而激活的,DDL触发器是响应以CREATE、ALTER或DROP开头的语句而激活的
6. 注意:
After触发器只能用于数据表中,Instead Of触发器可以用于数据表和视图上,但两种触发器都不可以建立在临时表上;
一个数据表可以有多个触发器,但是一个触发器只能对应一个表;
在同一个数据表中,对每个操作而言可以建立许多个After触发器,但Instead Of触发器针对每个操作只能能建立一个;
如果针对某个操作既设置了After操作又设置了Instead of触发器,那么Instead Of触发器一定会激活,而After触发器就不一定会激活了;
Truncate Table语句虽然类似于Delete语句可以删除记录,但是它不能激活delete类型的触发器;
WRITETEXT语句不能触发INSERT和UPDATE型的触发器;
不同的SQL语句,可以触发同一个触发器。
7. SQL语句创建DML触发器:
CREATE TRIGGER [schema_name .] trigger_name
ON { table | view }
[WITH <dm1_trigger_option> [,…n] ]
{FOR | AFTER | INSTEAD OF}
{ [ INSERT ] [,][update] [,][delete]}
[WITH APPEND]
[NOT FOR REPLICATION]
AS {sql_statement [;] [,…n] | EXTERNAL NAME <method specifier [;]>}
<dm1_TRIGGER_OPTION> ::=
[ENCRYPTION ]
[EXECUTE AS Clause ]
<method_specifier>::=
Assembly_name.class_name.method_name
8. sp_helptext/sp_help
9. 修改触发器
ALTER TRIGGER [schema_name .] trigger_name
ON { table | view }
[WITH <dm1_trigger_option> [,…n] ]
{FOR | AFTER | INSTEAD OF}
{ [ INSERT ] [,][update] [,][delete]}
[NOT FOR REPLICATION]
AS {sql_statement [;] [,…n] | EXTERNAL NAME <method specifier [;]>}
<dm1_TRIGGER_OPTION> ::=
[ENCRYPTION ]
[EXECUTE AS Clause ]
<method_specifier>::=
Assembly_name.class_name.method_name
GO
Sp_name [@trigger_name=] ‘trigger_name’,
[@new trigger_name=] ‘new_trigger_name’
10. 禁用触发器:
Alter table table_name
Disable or Enable trigger trigger_name or ALL
11. DDL触发器的创建
CREATE TRIGGER trigger_name
ON {ALL SERVER | DATABASE }
[WITH <ddl_trigger_option> [,…n] ]
{FOR | AFTER | }
{event_type ->event_group}[,…n]
AS {sql_statement [;] [,…n] | EXTERNAL NAME <method specifier [;]>}
<dm1_TRIGGER_OPTION> ::=
[ENCRYPTION ]
[EXECUTE AS Clause ]
<method_specifier>::=
Assembly_name.class_name.method_name
12. 管理DLL触发器:
CREATE TRIGGER/DROP TRIGGER/ALTER TRIGGER/sp_name/DISABLR TRIGGER/ENABLE TRIGGER