SQL大容量复制:触发器未被触发

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (49)

我正在使用sql批量复制将数据从Table1复制到Table2表。我已经在Table2上应用了触发器,但是我的触发器并未在每行上触发。这是我的触发器和sqlbulkcopy函数。

SqlConnection dstConn = new SqlConnection(ConfigurationManager.ConnectionStrings["Destination"].ConnectionString);
string destination = dstConn.ConnectionString;

//Get data from Source in our case T1 
DataTable dataTable = new Utility().GetTableData("Select * From  [db_sfp_ems].[dbo].[tbl_current_data_new] where [start_date]>'" + calculate_daily_Time + "' and status=0" , source);
SqlBulkCopy bulkCopy = new SqlBulkCopy(source, SqlBulkCopyOptions.FireTriggers)
{
    //Add table name of source
    DestinationTableName = "tbl_current_data",
    BatchSize = 100000,
    BulkCopyTimeout = 360
};
bulkCopy.WriteToServer(dataTable);
//MessageBox.Show("Data Transfer Succesfull.");
dstConn.Close();

- - - 触发 - - -

ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[tbl_current_data]
   AFTER INSERT 
AS 
BEGIN

    declare @intime datetime
    declare @sdp_id numeric
    declare @value numeric(9,2)


    SELECT @intime= DATEADD(SECOND, -DATEPART(SECOND, start_date), start_date)  FROM INSERTED

    SELECT @sdp_id= sdp_id  FROM INSERTED
    SELECT @value= value  FROM INSERTED

    INSERT INTO Table3(sdp_id,value,start_date)
    VALUES
    (
           @sdp_id,@value,@intime
    )
提问于
用户回答回答于
ALTER TRIGGER [dbo].[trgAfterInsert] ON [dbo].[tbl_current_data]
   AFTER INSERT 
AS 
BEGIN
    INSERT INTO Table3 (sdp_id, value, start_date)
        SELECT sdp_id, value, 
               DATEADD(SECOND, -DATEPART(SECOND, start_date), start_date)
        FROM inserted i;
END;
用户回答回答于

在插入后触发一个触发器,无论该插入涉及0,1还是多个记录对触发器都没有影响。所以,即使你插入了一大堆记录,触发器也只会被触发一次。这是设计的,并非特定的BULK_INSERT; 对于每种插入物都是如此。这也意味着inserted伪表可以保存0,1或多个记录。一定要以可处理多个记录的方式编写触发器。例如:SELECT @sdp_id= sdp_id FROM INSERTED如果存在inserted多个记录,将无法按预期工作。该变量将被设置,但你不知道它将保存什么值(从哪个插入的记录)。

扫码关注云+社区

领取腾讯云代金券