none
关于触发器的问题 RRS feed

  • 问题

  • ALTER TRIGGER [dbo].[insert_productID] 
       ON  [dbo].[a] 
       AFTER INSERT 
    AS
    
     
    BEGIN
    declare @ID int;
    select top 1 @ID=[productID] from [a] order by [productID] desc
    	insert into [b] ([productID],[aaa],[bbb]) 
    values 
    (@ID,0,0)
    
    END

    我创建了一个触发器,作用是当a表插入新数据时,b表中自动插入a表中的主键[productID]的值,在我用后台插入新纪录时是正常的,但我发现用SQL语句批量插入a表时,

    b表中只插入了最后一行,也就是说触发器只触发了一次,不知道问题出在哪,是不是我的触发器还有什么地方需要改进?希望各位指点一下!谢谢!

    2010年4月9日 2:04

答案

  • ALTER TRIGGER [dbo].[insert_productID] 
       ON  [dbo].[a] 
       AFTER INSERT 
    AS
    
     
    BEGIN
    declare @ID int;
    insert into [b] ([productID],[aaa],[bbb]) 
    select productID,0,0 from inserted
    END
    
    --这么修改一下吧,inserted表示插入的数据集,可能是一条或者多条。

    family as water
    • 已建议为答案 willing66 2010年4月13日 3:49
    • 已标记为答案 雪之翼 2010年4月16日 5:52
    2010年4月9日 2:22

全部回复

  • Trigger fires once when you insert rows to the table, no matter how many rows inserted. You should get new rows from inserted table intead of table a. 
    2010年4月9日 2:07
  • 你可以查询inserted表,将里面的数据插入到目标表


    有dba的职位吗(北京的),请联系我 stswordman#hotmail.com
    2010年4月9日 2:19
    版主
  • ALTER TRIGGER [dbo].[insert_productID] 
       ON  [dbo].[a] 
       AFTER INSERT 
    AS
    
     
    BEGIN
    declare @ID int;
    insert into [b] ([productID],[aaa],[bbb]) 
    select productID,0,0 from inserted
    END
    
    --这么修改一下吧,inserted表示插入的数据集,可能是一条或者多条。

    family as water
    • 已建议为答案 willing66 2010年4月13日 3:49
    • 已标记为答案 雪之翼 2010年4月16日 5:52
    2010年4月9日 2:22
  • inserted表示插入的数据集,请问这个数据集是a表的还是整个数据库的?也就是我其他表如果同时在插入的情况下,这个触发器会不会有问题?
    2010年4月9日 2:47
  • Belongs to trigger fired, will not mess up with other triggers.

    2010年4月9日 2:49
  • sql servr 没有行级斛发器, 它是每个操作触发一次.

    比如

    insert tb select * frm t1

    这个操作只会触发 tb 上的触发器一次, inserted这个逻辑表中包含这一次插入操作涉及的所有记录

    2010年4月9日 4:33
  • 对于insert触发, inserted是和你的 insert 操作同一作用域的, 涉及的数据也仅仅是你这个insert操作涉及的数据, 并不包含其他数据(比如并发有两个 insert, 则各自触发一次, 并且 inserted中仅包含各自的数据)
    2010年4月9日 4:34
  • 问题在于触发器的逻辑有问题, 不要用" select top 1 " 用 "Insert into [b] Select [ProductId],0,0from Inserted" 代替.

    inserted是可能有多条数据的


    Jeffrey
    2010年4月9日 9:54