16

我正在使用具有有限权限的数据库用户将 ADO.NET 2.0 SqlBulkCopy 对象从 C# 方法批量插入到 MS SQL 2005 数据库中。当我尝试运行该操作时,我收到错误消息:

批量复制失败。用户对表 'theTable' 没有 ALTER TABLE 权限。'FIRE_TRIGGERS'如果表具有触发器或 检查约束,但未'CHECK_CONSTRAINTS'将批量提示指定为批量复制命令的选项,则需要对批量复制操作的目标表具有 ALTER TABLE 权限。

我阅读了一些文档并使用构造函数创建了大容量复制对象,该构造函数允许我指定此类内容:

    SqlBulkCopy bc = new SqlBulkCopy(
        System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"],
        SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints);

但这并没有改变任何东西 - 我收到与以前相同的错误消息。我尝试摆弄其他一些 SqlBulkCopyOptions 值,但没有运气。我真的认为这会解决问题,我错过了什么吗?

在将表上的 ALTER 授予我的用户后,我测试了该过程,并且操作成功。但是,这不是我的情况的选择。

4

2 回答 2

28

解决了!看起来我需要对标志枚举进行复习。当我应该对它们进行 ORing 时,我正在对枚举值进行按位与运算。

SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints

计算结果为零(相当于 SqlBulkCopyOptions.Default。)

SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints

工作正常并允许批量插入完成。

于 2008-12-17T14:28:14.910 回答
2

仅此而已,对不起

BULK INSERT的 SQL 文档指定了需要 ALTER TABLE 的 3 种情况。你列出了其中的 2 个。是否设置了 KeepIdentity 选项,即使不需要?

另一种选择是表上的触发器已经被禁用,这使问题变得混乱。用于ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL确保启用。

于 2008-12-17T08:18:12.490 回答