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

解決しました!フラグ列挙型の復習が必要なようです。列挙値を OR する必要があるときに、列挙値をビット単位で AND していました。

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 に答える