导入大容量数据时控制触发器执行

“触发器”是一种特殊形式的存储过程,它在用户修改表中或视图中的数据时自动执行。执行触发器会影响大容量导入操作的性能。例如,每次导入记录时就发送电子邮件的触发器会降低大容量导入操作的速度并创建一些电子邮件。

大容量导入数据时,您可以控制大容量导入操作是否执行(触发)触发器。大容量导入操作应只对包含支持多行插入的 INSERT 和 INSTEAD OF 触发器的表执行触发器。有关这些触发器的详细信息,请参阅 DML 触发器

重要说明重要提示

如果触发器被禁用,更新元数据时可能会使用架构修改锁。这会影响其他命令(例如,联机索引生成)或事务。例如,由于在同时执行 DDL 更改,访问目标表的快照隔离事务可能会失败。

如果触发器被启用,触发器对每个批处理执行一次。

大容量导入操作期间,行为取决于操作所使用的命令。bcp 命令和 BULK INSERT (Transact-SQL) 语句在默认情况下会禁用触发器。而 INSERT ... SELECT * FROM OPENROWSET(BULK...) 语句在默认情况下会执行触发器。

下表总结了默认行为。

大容量导入命令

默认行为

bcp

禁用触发器

BULK INSERT

禁用触发器

INSERT ...SELECT * FROM OPENROWSET(BULK...)

执行触发器

每个大容量导入命令都提供一个允许用户更改处理触发器的方式的限定符,以下各节进行了介绍。

使用 bcp 或 BULK INSERT 执行触发器

默认情况下,bcp 命令和 BULK INSERT 语句不执行触发器。但是,您可以使用下列限定符启用触发器:

命令

限定符

限定符类型

bcp

-h"FIRE_TRIGGERS"

提示

BULK INSERT

FIRE_TRIGGERS

参数

如果为大容量导入操作指定了 FIRE_TRIGGERS,则它将对插入表中的所有行执行在表上定义的所有 INSERT 和 INSTEAD OF 触发器。

有关详细信息,请参阅 bcp 实用工具BULK INSERT (Transact-SQL)

在 INSERT ... SELECT * FROM OPENROWSET(BULK...) 中禁用触发器

默认情况下,OPENROWSET 大容量行集提供程序执行触发器。您可以使用下列限定符禁用触发器:

命令

限定符

限定符类型

INSERT ...SELECT * FROM OPENROWSET(BULK...)

WITH(IGNORE_TRIGGERS)

表提示

如果指定了此提示,则 OPENROWSET 大容量行集提供程序不执行触发器。有关 IGNORE_TRIGGERS 提示的详细信息,请参阅表提示 (Transact-SQL)

在启用触发器的情况下导入大批数据

SQL Server 2005 及更高版本对触发器使用行版本控制,并将行版本存储在 tempdb 中的版本存储区中。您可能需要增加 tempdb 的大小以适应触发器对版本存储区的影响,才能使用触发器大容量导入大批数据记录。有关详细信息,请参阅行版本控制资源的使用情况