2008-12-16 13 views
13

Ich führe eine Masseneinfügung mit einem ADO.NET 2.0 SqlBulkCopy-Objekt aus einer C# -Methode in eine MS SQL 2005-Datenbank unter Verwendung eines Datenbankbenutzers mit eingeschränkten Berechtigungen durch. Wenn ich versuche, den Vorgang auszuführen, erhalte ich die Fehlermeldung:SqlBulkInsert - Wie Feuer Auslöser einstellen, Bedingungen prüfen?

Bulk-Kopie fehlgeschlagen. Der Benutzer verfügt nicht über die Berechtigung ALTER TABLE für die Tabelle 'theTable'. ALTE TABLE-Berechtigung wird auf der Zieltabelle eines Massenkopiervorgang erforderlich, wenn die Tabelle Trigger hat oder Einschränkungen überprüfen, aber 'FIRE_TRIGGERS' oder 'CHECK_CONSTRAINTS' Bulk-Hinweise sind nicht als Optionen für den Massenkopier Befehl angegeben.

las ich eine Dokumentation und erstellt das Massenkopier Objekt mit dem Konstruktor, der mir solche Dinge angeben können:

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

Aber dies ändert nichts - ich bekomme die gleiche Fehlermeldung wie zuvor. Ich habe versucht, mit einigen anderen SqlBulkCopyOptions-Werten herumzuspielen, aber kein Glück. Ich dachte wirklich, dass das das Problem lösen würde, vermisse ich etwas?

Ich testete die Prozedur, nachdem ich meinem Benutzer ALTER in der Tabelle gewährt hatte, und der Vorgang war erfolgreich. Dies ist jedoch keine Option für meine Situation. nur

Antwort

22

Gelöst es! Sieht so aus, als ob ich eine Auffrischung der Flags-Enums benötige. Ich war bitweise ANDing die Enum-Werte, wenn ich hätte ORing sie hätte.

SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints 

wertet auf Null (was SqlBulkCopyOptions.Default äquivalent ist.)

SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints 

korrekt funktioniert und erlaubt die Masseneinfügung zu vervollständigen.

+0

Fairer Anruf. Hoppla! – gbn

+1

Ich wusste nicht, dass diese Optionen existieren, aber ein kreatives Suchen hat mich hierher gebracht. Mein Problem mit SqlBulkCopy wurde in einer Tabelle mit Triggern * gelöst, ohne dass ich meine SQL-Login-ALTER TABLE-Berechtigungen erhalten musste! – madannes

2

Möglichkeiten, tut mir leid

SQL-Dokumentation für BULK INSERT 3 Fälle gibt, wo ALTER TABLE benötigt wird. Sie haben 2 von ihnen aufgelistet. Ist die Option KeepIdentity gesetzt, auch wenn sie nicht benötigt wird?

Eine weitere Option ist, dass der Auslöser für die Tabelle bereits deaktiviert ist, was das Problem verwirrte. Verwenden Sie ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL um sicherzustellen, aktiviert.

+0

Danke für die Tipps gbn, habe ich versucht, bevor ich die Antwort realisiert (siehe unten). –