看来楼主对触发器的概念还没理解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

解决方案 »

  1.   

    在触发器中怎样清除Deleted中的数据?
    我认为楼主很会思考,并不是对触发器不了解。既然Deleted是临时表,按理是很可以删除。但又有多少人会问
    如何清除Deleted中的数据?很少。
    楼主却提问到了。了不起的思维模式。努力...  ^-^
      

  2.   

    谢谢楼上的朋友,我再表述一下我的问题。
    我遇到的情况是有三个表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内部原理不太了解,请各位高手指教。
      

  3.   

    楼主,你可能对deleted搞错了吧!比如说我现在对table1表建立了delete触发器,当你删除table1中的数据的时候,这个时候你的deleted表里面存储的是table1中删除掉的数据,即使你在触发器中又删除了table2中的数据,table2中的数据也不会存储在这个deleted表中,table2中删除的数据只会存储在table2中对应的触发器中的deleted表中!
      

  4.   

    可是事实上的删除顺序是这样的Table1中删除了row11,Table2中删除了row21,Table3中更新了row31,
    Table2删除row22,Table3更新了row32到此刻Deleted表中会有两条数据row31 和 row32 为什么?
    删除row22后执行了更新操作再删除deleted为什么不为空而是保存了上次删除操作的数据我现在就是不太明白Deleted表在什么时候会清空 谢谢各位的关注
      

  5.   

    我记得deleted表和insert表是不能被用户sql更新的。
      

  6.   

    table1所建的触发器
    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 里面的数据是一一对应关系吗
      

  7.   

    table1所建的触发器
    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)
      

  8.   

    table1所建的触发器
    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)