Trigger iud

满足更新条件的行都触发......


可以在trigger中使用它的两个逻辑表 inserted和deleted
在update时,表中的老数所会保存在deleted中
>>>>>>>>>>>>>>要新增加的数据会保存在inserted中
所以通过这两个表可以确定,你要update的是那一行


樓上說的是sqlserver中的吧
oracle中如果想知道更新行欄位的新舊值,有二個關鍵詞 (:old_col,:new_col)


小弟知道,
:old.fieldname  
:new.fieldname
就可以访问被更新的,和更新的记录了。
那只是针对一条,如果我更新多行呢?


那就把:old.fieldname  /:new.fieldname 作为条件,再写一个update语句,如果在一张表操作,可能会遇到变异表的问题,建议还是把触发器建到一个临时表中去。


行级触发器

posted on 2006-02-08 19:16 青蛙學堂 阅读(400) 评论(2)  编辑 收藏 引用 所属分类: 數據庫

评论

# re: Trigger iud 2006-02-08 19:20 -

前几天贾工给我说了说触发器,正好有个机会我就试了一下:



CREATE TRIGGER WhenChangeIsOver

ON dbo.Service

FOR UPDATE

AS

BEGIN

print '按时完成'

UPDATE Service

SET IsCompleteByTime = '1'

WHERE IsOver = '1' AND NeedCompleteDate >= OverDate AND

ServiceID IN (SELECT ServiceID FROM Inserted)



print '没有按时完成'

UPDATE Service

SET IsCompleteByTime = '2'

WHERE IsOver = '1' AND NeedCompleteDate < OverDate AND

ServiceID IN (SELECT ServiceID FROM Inserted)

END



需要注意的两个表:Deleted、Inserted

Deleted 表用于存储 DELETE 和 UPDATE 语句所影响的行的复本。在执行 DELETE 或 UPDATE 语句时,行从触发器表中删除,并传输到 deleted 表中。Deleted 表和触发器表通常没有相同的行。

Inserted 表用于存储 INSERT 和 UPDATE 语句所影响的行的副本。在一个插入或更新事务处理中,新建行被同时添加到 inserted 表和触发器表中。Inserted 表中的行是触发器表中新行的副本。

  回复  更多评论   

# re: Trigger iud 2006-02-08 19:22 -

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'


  回复  更多评论   

只有注册用户登录后才能发表评论。
<2006年2月>
2930311234
567891011
12131415161718
19202122232425
2627281234
567891011

导航

统计

常用链接

留言簿(7)

随笔分类

随笔档案

收藏夹

青蛙学堂

最新评论

阅读排行榜

评论排行榜