触发器每次只对最后一条记录做出响应,要实现成批触发,需要操作inserted、deleted两个表,因为这两个表中保存的是你一次操作的插入、删除的所有记录,具体实现,可以自己写,不复杂。

解决方案 »

  1.   

    假设,我把(1,'aaa')改为(2,'bbb'),那么在deleted表中应该是(1,'aaa'),在inserted表中应该是(2,'bbb'),这两条记录之间是如何联系的?因为我把主键也给改变了。
      

  2.   

    只要你用了inserted和deleted表,还有你update语句中的条件合理的话,不会只修改一条记录的。看看你的关联条件是否正确
      

  3.   

    你的触发器没有写好. 所以会出现这种情况.参考:
    有两个表。一个表示客户表。另一个表是订单表。如何在订单表中设置一个触发器,当订单表增加一个数据的时候,那么根据增加数据的客户编号,和金额,自动更新客户表中的客户的总金额(当前金额+订单表中的新增的那个金额)--触发器的写法:
    CREATE TRIGGER trig_tz ON [dbo].[item] 
    FOR INSERT
    AS
    update a set money_total=isnull(a.money_total,0)+isnull(b.money_total,0)
    from cust a join(
    select custid,money_total=sum([money])
    from inserted
    group by custid
    )b on a.cust_id=b.custid
      

  4.   

    请各位看一下这些语句:drop table test1
    drop table test2
    go
    create table test1(id int,name varchar(10))
    create table test2(id int,name varchar(10))
    go
    insert into test1 values(1,'aaa')
    insert into test1 values(2,'bbb')insert into test2 values(1,'aaa')
    insert into test2 values(2,'bbb')
    go
    update test1 set id=id+1,name=name+name
    select * from test1
    select * from test2我想写一个触发器,使test2和test1保持一致,应该怎么写呢?
      

  5.   

    每条更新数据的SQL语句执行一次触发器,而不是没条被更新记录执行一次触发器,这是我觉得SQL Server比Oracle强大的地方——速度快很多。
      

  6.   

    create trigger tr_process on test1 
    for insert,update,delete
    as
    delete from test2 a
    where  exists(select 1 from deleted where id=a.id and name=a.name)insert test2 select * from inserted
      

  7.   

    create trigger tr_process on test1 
    for insert as
    insert test2(......) select ...... from inserted a where not exists
      (select * from deleted where id=a.id and name=a.name)
    go说明;
    1. 不是所有对象都很容易删除的。特别是当有触发器时,删除操作有业务意义。因此,修改一个记录并不等价于“先删除原来记录再加入新记录”,这里也类似,要顺应业务上的定义,避免搞乱业务。2. “......”的地方应该填上字段名列表,不填是极其“坏味道”的做法,能正确使用仅仅是当前暂时的侥幸。
      

  8.   

    只有test1与test2的字段列表(包括类型、顺序和个数)恰好完全一致时才能省略。但最好也加上。