看来楼主对触发器的概念还没理解Inserted 和 Deleted表只有在插入、删除、更新操作的同时产生,是临时表,插入、删除、更新操作一完成就删除了对应的Inserted 和 Deleted表,所以Deleted中的数据不必清除,也没有Inserted 和 Deleted表的状态和状态的变化至于设置Deleted中数据的个数,我不知道楼主是不是想通过触发器限制一次删除的记录数,如果是,以下代码就是这个功能的(没有测试,不过估计没错):create trigger tr_limit_test
on test
for delete
asif (select count(*) from deleted)>10
begin
raiserror('一次删除的记录不能超过10条',1,16)
rollback tran
endgo
on test
for delete
asif (select count(*) from deleted)>10
begin
raiserror('一次删除的记录不能超过10条',1,16)
rollback tran
endgo
我认为楼主很会思考,并不是对触发器不了解。既然Deleted是临时表,按理是很可以删除。但又有多少人会问
如何清除Deleted中的数据?很少。
楼主却提问到了。了不起的思维模式。努力... ^-^
我遇到的情况是有三个表Table1 Table2 Table3
Table1中的一条记录对应Table2中的多条记录 Table2中的一条记录对应Table3中的一条记录
现我在Table1中建立Trigger1,作用是当删除Table1中的一条记录时同时删除该记录在Table2
中对应的多条记录。在Table2中建立Trigger2,作用是当Table2的一条记录被删除,则更改该
记录在Table3中对应记录的某列,假设将该列的值加一。注意,我在Trigger2中写的逻辑是只要
Table3中的记录在Deleted表中出现就更新该条记录。实际运行的时候分成两种情况
第一种情况是不管Table1,手动删除Table2的数据,Table3的数据更新正常(每条对应数据只更新一次,因为是一对一的关系,Table2中一条记录被删除,Table3中就有唯一一条记录被更新)
第二种情况是直接删除Table1中的记录,触发Trigger1,删除Table2中对应的多条记录,继而
触发Trigger2。这里出问题了,我发现删除Table1种的一条记录后Table3中的一条记录被更新
多次,论上Table1与Table3是一对多的关系,删除Table1中的一条记录会影响多条Table3中的记录,
但只影响一次,为什么会出现单条记录被更新多次的情况呢〉?
我追查原因原来用第二种方法删除数据后Deleted表中的数据项并不是一条,而是多条。一次删除操作后所删除的项目就在Deleted表中储存起来。而用第一种方法Deleted表中的数据项总是保持一项。应该说我删除Table1中一条记录后引发的一系列操作所删除的数据都储存在了Deleted表中,其中涉及到了三个表的删除操作,我不知道SQLServer对于这样的操作实现细节是怎样的?还是对Trigger内部原理不太了解,请各位高手指教。
Table2删除row22,Table3更新了row32到此刻Deleted表中会有两条数据row31 和 row32 为什么?
删除row22后执行了更新操作再删除deleted为什么不为空而是保存了上次删除操作的数据我现在就是不太明白Deleted表在什么时候会清空 谢谢各位的关注
CREATE TRIGGER [TRIGGER test] ON [dbo].[ws_aj]
FOR DELETE
AS
delete from ws_jn where ajid in (select id from deleted)
talle2所建触发器
CREATE TRIGGER [TRIGGER test1] ON [dbo].[ws_jn]
FOR INSERT, UPDATE, DELETE
AS
update ws_yj set ws_yj.tm=ws_yj.tm+1 from ws_yj,deleted where ws_yj.jnid=deleted.id
我测试过了,没有你说的那个情况首先你确认一下 table2 与 table3 里面的数据是一一对应关系吗
CREATE TRIGGER [TRIGGER test] ON [dbo].[tr_1]
FOR DELETE
AS
delete from table2 where id in (select id from deleted)talle2所建触发器
CREATE TRIGGER [TRIGGER test1] ON [dbo].[tr_2]
FOR DELETE
AS
delete from table3 where id in (select id from deleted)
CREATE TRIGGER [TRIGGER test] ON [dbo].[tr_1]
FOR DELETE
AS
delete from table2 where id in (select id from deleted)talle2所建触发器
CREATE TRIGGER [TRIGGER test1] ON [dbo].[tr_2]
FOR DELETE
AS
delete from table3 where id in (select id from deleted)