Sql-Server 主要提供了两种机制来强制业务规则和数据完整性:约束constrain 和 触发器 trigger ..
触发器在制定的表中发生变化时被调用以响应insert,update,delete事件。
trigger可以查询其他表,包含复杂的T-sql语句,并支持回滚.

每个触发器都会创建两个逻辑专用表inserted 和 deleted表,表结构与被触发作用的表结构相同 执行完毕后 与触发器相关的两个表都会被删除。
当执行insert语句时,inserted表存放要向表中插入的所有行
当执行delete语句时,deleted表存放要向表中删除的所有行
当执行update语句时,相当于执行一个delete操作,再执行一个insert操作,旧的行先被移动到deleted表,然后再在新值插入到inserted表和目标表。


一般的创建trigger : (for / after 语句 触发)

触发器 Triggeruse DB_name
触发器 Trigger
go
触发器 Trigger
--
触发器 Trigger
create trigger trigger_name
触发器 Trigger
on table_Name   // On 关键字
触发器 Trigger
[with Encryption] //加密
触发器 Trigger
for [/ after] {[insert [,]/ update [,] /delete]} --指定触发器只有在触发SQL语句中制定的所有操作都已经成功执行后才激发。(包括所有的级联和约束都检查成功后才能激发)
触发器 Trigger
AS
触发器 Trigger
[SQL-statements]
触发器 Trigger
触发器 Trigger
go 
触发器 Trigger
触发器 Trigger

利用触发器instead of 语句代替其他语句操作 (就不执行instead of 后面指定的SQL指令而执行Trigger体 [sql-statements])

触发器 Triggeruse Db_Name
触发器 Trigger
go
触发器 Trigger
create trigger Trigger_Name
触发器 Trigger
on Table_name
触发器 Triggerinstead 
of [insert,update,delete]
触发器 Trigger
as 
触发器 Trigger
[sql_statements]
触发器 Trigger
go

例如在系统查询分析器执行 update t1 set column_1='aaa' where id=123 可以看到t1下123号的column_1值没有预期改变 而是按照Trigger中 [sql-statements]中的格式走了

如何利用inserted 和 deleted表:
例: 创建一个触发器 要求当插入 删除 更新 T1表数据时 能更新 T2表中相应的C2字段值 (C2是统筹t1的字段)

触发器 Triggeruse DB_Name
触发器 Trigger
go
触发器 Trigger
create trigger T_name
触发器 Trigger
on T1
触发器 Trigger
for update,insert,delete
触发器 Trigger
as 
触发器 Trigger
update T2 set C2=C2+1 where id=(select id from inserted)
触发器 Trigger
update T2 set C2=C2-1 where id=(select id from deleted)
触发器 Trigger
go
触发器 Trigger
//

if update(column)语句 
触发器 Triggeruse DB_Name
触发器 Trigger
go
触发器 Trigger
Alter Trigger Test1
触发器 Trigger
on T1
触发器 Trigger
for update
触发器 Trigger
as
触发器 Trigger
if update(PWD) print 'password has changed..'
触发器 Trigger
go
触发器 Trigger


用来检测修改该字段的操作

ps:允许多个事件insert delete update创建多个触发器 ,且相互不影响



-----
系统操作

改名trigger :    sp_remane Old_Trigger_name,NewTrigger_Name

禁用: Alter Table T1 DISABLE trigger Trigger_Name

查询: select * from sysObjects where Type='TR'



相关文章: