如何在insert sql语句中使用FIRE_TRIGGERS

时间:2010-11-17 07:04:37

标签: sql sql-server tsql triggers

我正在尝试将表“tb_A”中的数据复制到自身(使用不同的主键)。

当“tb_A”表插入新记录时,我写了一个触发器,用一条记录填充另一个表“tb_B”。

我发表了以下声明。

INSERT INTO [tb_A]
       ([NAME])
 select top (20)[NAME] from [tb_A] 

我预计“tb_B”中有20条新记录。但我没有。

无论如何,我看到FIRE_TRIGGERS在批量插入期间正在使用它来克服这个问题。 是否有任何方法可以在插入语句中使用它?请举例说明。

加扬


触发代码(从Gayan的评论复制到gbn的答案):

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT
AS
    DECLARE @AID as int
    SELECT @AID = [ID] FROM inserted

    INSERT INTO [tb_B]([IDA]) VALUES (@AID)

2 个答案:

答案 0 :(得分:2)

您的触发器无法正常工作的原因是因为它的设计很差。即使您要插入一百万条记录,也会为每个插入触发一次。你有一个触发器,它假设它一次只能记录一条记录。无论何时将值表单插入或删除到标量变量,触发器都是错误的,需要重写。尝试这样的事情。

CREATE TRIGGER UpdatetbB ON [dbo].[tb_A] FOR INSERT 
AS 

    INSERT INTO [tb_B]([IDA])
    SELECT  [ID] FROM inserted 

答案 1 :(得分:1)

FIRE_TRIGGERS仅适用于BULK INSERT(和bcp),而非“标准”INSERT

我希望你的触发器看起来像

CREATE TRIGGER TRG_tbA_I ON tb_A FOR INSERT
AS
SET NOCOUNT ON

INSERT tb_B (col1, col2, ...)
SELECT col1, col2, ... FROM INSERTED
GO

使用特殊的INSERTED表获取tb_A中的新行列表,然后从中插入到tb_B中。这适用于多行

如果您添加触发器代码,那么我们可以解释出现了什么问题。

编辑:您的触发器只会从INSERTED中读取单行(任何行,无特定顺序)。它没有像我粗略的例子那样设置。