触发器 trigger ..
2007-01-09 16:56
148 查看
Sql-Server 主要提供了两种机制来强制业务规则和数据完整性:约束constrain 和 触发器 trigger ..
触发器在制定的表中发生变化时被调用以响应insert,update,delete事件。
trigger可以查询其他表,包含复杂的T-sql语句,并支持回滚.
每个触发器都会创建两个逻辑专用表:inserted 和 deleted表,表结构与被触发作用的表结构相同 执行完毕后 与触发器相关的两个表都会被删除。
当执行insert语句时,inserted表存放要向表中插入的所有行
当执行delete语句时,deleted表存放要向表中删除的所有行
当执行update语句时,相当于执行一个delete操作,再执行一个insert操作,旧的行先被移动到deleted表,然后再在新值插入到inserted表和目标表。
一般的创建trigger : (for / after 语句 触发)
use DB_name
go
--
create trigger trigger_name
on table_Name // On 关键字
[with Encryption] //加密
for [/ after] {[insert [,]/ update [,] /delete]} --指定触发器只有在触发SQL语句中制定的所有操作都已经成功执行后才激发。(包括所有的级联和约束都检查成功后才能激发)
AS
[SQL-statements]
go
利用触发器instead of 语句代替其他语句操作 (就不执行instead of 后面指定的SQL指令而执行Trigger体 [sql-statements])
use Db_Name
go
create trigger Trigger_Name
on Table_name
instead of [insert,update,delete]
as
[sql_statements]
go
例如在系统查询分析器执行 update t1 set column_1='aaa' where id=123 可以看到t1下123号的column_1值没有预期改变 而是按照Trigger中 [sql-statements]中的格式走了
如何利用inserted 和 deleted表:
例: 创建一个触发器 要求当插入 删除 更新 T1表数据时 能更新 T2表中相应的C2字段值 (C2是统筹t1的字段)
use DB_Name
go
create trigger T_name
on T1
for update,insert,delete
as
update T2 set C2=C2+1 where id=(select id from inserted)
update T2 set C2=C2-1 where id=(select id from deleted)
go
//
if update(column)语句
use DB_Name
go
Alter Trigger Test1
on T1
for update
as
if update(PWD) print 'password has changed..'
go
用来检测修改该字段的操作
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'
触发器在制定的表中发生变化时被调用以响应insert,update,delete事件。
trigger可以查询其他表,包含复杂的T-sql语句,并支持回滚.
每个触发器都会创建两个逻辑专用表:inserted 和 deleted表,表结构与被触发作用的表结构相同 执行完毕后 与触发器相关的两个表都会被删除。
当执行insert语句时,inserted表存放要向表中插入的所有行
当执行delete语句时,deleted表存放要向表中删除的所有行
当执行update语句时,相当于执行一个delete操作,再执行一个insert操作,旧的行先被移动到deleted表,然后再在新值插入到inserted表和目标表。
一般的创建trigger : (for / after 语句 触发)
use DB_name
go
--
create trigger trigger_name
on table_Name // On 关键字
[with Encryption] //加密
for [/ after] {[insert [,]/ update [,] /delete]} --指定触发器只有在触发SQL语句中制定的所有操作都已经成功执行后才激发。(包括所有的级联和约束都检查成功后才能激发)
AS
[SQL-statements]
go
利用触发器instead of 语句代替其他语句操作 (就不执行instead of 后面指定的SQL指令而执行Trigger体 [sql-statements])
use Db_Name
go
create trigger Trigger_Name
on Table_name
instead of [insert,update,delete]
as
[sql_statements]
go
例如在系统查询分析器执行 update t1 set column_1='aaa' where id=123 可以看到t1下123号的column_1值没有预期改变 而是按照Trigger中 [sql-statements]中的格式走了
如何利用inserted 和 deleted表:
例: 创建一个触发器 要求当插入 删除 更新 T1表数据时 能更新 T2表中相应的C2字段值 (C2是统筹t1的字段)
use DB_Name
go
create trigger T_name
on T1
for update,insert,delete
as
update T2 set C2=C2+1 where id=(select id from inserted)
update T2 set C2=C2-1 where id=(select id from deleted)
go
//
if update(column)语句
use DB_Name
go
Alter Trigger Test1
on T1
for update
as
if update(PWD) print 'password has changed..'
go
用来检测修改该字段的操作
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'
相关文章推荐
- oracle 触发器 (trigger)
- SQL Trigger _ 触发器
- oracle:触发器,自治事务,instead of trigger,trigger
- sql server trigger(触发器)
- Oracle 中序列(sequence)和触发器(trigger)的使用
- Unity3D碰撞检测及Trigger触发器的使用及注意事项
- SQL Server 使用触发器(trigger)发送电子邮件步骤详解
- Mysql 触发器 trigger
- 触发器(Trigger)(四)
- 触发器(Trigger) 原理&例子
- mysql之触发器trigger 详解
- Unity 碰撞器(Collider)与触发器(Trigger)
- (17)触发器trigger
- 触发器经典教程 Trigger
- mysql 触发器(trigger)
- mysql触发器trigger 实例详解
- SQL Server中的触发器trigger
- 触发器(六)Trigger_Insert_VocMin_deleteData
- 数据库触发器(Trigger)的一点使用心得
- 触发器(十四)Trigger_Insert_VocMinPS