ALTER TABLE permission is required on the target table of a bulk copy operation if the table has triggers or check constraints, but 'FIRE_TRIGGERS' or 'CHECK_CONSTRAINTS' bulk hints are not specified
这个是使用SqlBulkCopy进行批量复制导致的异常,此问题涉及大容量导入数据时,控制大容量导入操作是否执行(触发)触发器。大容量导入操作应只对包含支持多行插入的 INSERT 和 INSTEAD OF 触发器的表执行触发器。
SqlBulkCopy(insert bulk)命令语句在默认情况下会禁用触发器,可以启用FIRE_TRIGGERS;报错“如果某个大容量复制操作的目标表具有触发器或检查约束,但未指定“fire_triggers”或“check_constraints”大容量提示,则需要对该表具有“alter table”权限。”已说明并未指定fire_triggers且目标表有触发器,指定SqlBulkCopyOptions.FireTriggers即可启用,语句为:SqlBulkCopy sqlbulkcopy = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.UseInternalTransaction | SqlBulkCopyOptions.FireTriggers)。
至此,该异常的原因和解决办法就是这样。
另外,MSDN表示“大容量导入数据时,您可以控制大容量导入操作是否执行(触发)触发器。大容量导入操作应只对包含支持多行插入的 INSERT 和 INSTEAD OF 触发器的表执行触发器”,所以对触发器是有要求的,一是insert触发器,二是instead of。
上面搞清楚之后,就是另外一个话题:一次插入多条数据,触发器在必要时需要使用游标来实现所需功能。