使用“插入向导”后,永不触发“插入触发器”

时间:2019-01-02 07:21:51

标签: sql-server tsql database-trigger

使用导入向导,我尝试将数据导入表tcc_BlockPROJECT_IDENTITY中。

这2个表结构已经存在于SQL Server中,并且通过ProjectID列进行关联。 PROJECT_IDENTITY具有ProjectID作为PK和tcc_Block作为FK密钥。

每次导入表时,父表中的ProjectID都会创建并递增,但子表中的NULL始终是。{p>

触发器永不触发!?

ALTER TRIGGER [dbo].[InsertTest]
ON [dbo].[tcc_Block]
AFTER INSERT
AS
BEGIN
    DECLARE @proj int;

    SELECT @proj = MAX(ProjectID) 
    FROM PROJECT_IDENTITY;

    UPDATE tcc_Block
    SET ProjectID = @proj
    WHERE ProjectID IS NULL;
END;
GO

2 个答案:

答案 0 :(得分:0)

Bulk inserts通常不会触发触发器,除非它被显式设置(请参阅FIRE_TRIGGERS)。如果在SSIS中编辑了此程序包(“导入导出向导”将生成SSIS程序包),则可以在“批量插入任务编辑器选项”页面上选择“触发”选项。但是“导入导出向导”没有提供设置此选项的方法。您可以将包保存到文件系统中,然后在Visual Studio中对其进行编辑以启用此选项,也可以将数据导出为平面文件,并使用BULK INSERT命令(指定FIRE_TRIGGERS选项)将其导入。

答案 1 :(得分:0)

我在将SQL 2008导出另存为文件系统中的dtsx包时遇到了类似的问题。因此,我在SSMS 2016中打开了该程序包,并将其作为xml文件打开。我找到了“ FastLoadOptions”属性:属性id =“ 72” name =“ FastLoadOptions”。 然后滚动到输入选项的行的末尾并添加“ FIRE_TRIGGERS”:

  

TABLOCK,CHECK_CONSTRAINTS,FIRE_TRIGGERS /属性>。   保存并重新加载到我的工作步骤中(不要忘记检查“执行”选项卡上的“使用32位运行时”)。而且效果很好。