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

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

大容量导入数据时,您可以控制大容量导入操作是否执行(触发)触发器。大容量导入操作应只对包含支持多行插入的 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 的大小以适应触发器对版本存储区的影响,才能使用触发器大容量导入大批数据记录。有关详细信息,请参阅行版本控制资源的使用情况。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16436858/viewspace-503399/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16436858/viewspace-503399/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值