代码之家  ›  专栏  ›  技术社区  ›  James Orr

SQLBulkInsert-如何设置激发触发器,检查约束?

  •  14
  • James Orr  · 技术社区  · 16 年前

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

    大容量复制失败。用户没有 更改表的表权限 “餐桌”。改变 表权限是 大容量复制操作的目标表 如果表有触发器或检查 约束,但是 'FIRE_TRIGGERS' 'CHECK_CONSTRAINTS' 批量提示不是 指定为大容量复制的选项 命令。

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

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

    但这并没有改变任何东西——我收到了和以前一样的错误消息。我试着摆弄其他一些sqlbackCopyOptions值,但没有运气。我真的以为这样可以解决问题,我错过什么了吗?

    我在向我的用户授予表上的alter之后测试了这个过程,操作成功了。但这不是我的选择。

    2 回复  |  直到 14 年前
        1
  •  24
  •   James Orr    16 年前

    解决了!看起来我需要刷新标记枚举。当我应该对枚举值进行ORing时,我对它们进行了位和运算。

    SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints
    

    计算结果为零(相当于sqlbackCopyOptions.default。)

    SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints
    

    工作正常,允许大容量插入完成。

        2
  •  2
  •   gbn    16 年前

    只有可能,对不起

    的SQL文档 BULK INSERT 指定需要更改表的3个事例。您列出了其中2个。是否正在设置keepidEntity选项,即使不需要?

    另一个选项是表上的触发器已经被禁用,从而混淆了问题。使用 ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL 以确保启用。