2008-12-16 17 views
13

J'effectue une insertion en bloc avec un objet SqlBulkCopy ADO.NET 2.0 à partir d'une méthode C# dans une base de données MS SQL 2005, en utilisant un utilisateur de base de données avec des autorisations limitées. Lorsque j'essaie d'exécuter l'opération, le message d'erreur s'affiche:SqlBulkInsert - Comment définir les déclencheurs d'incendie, vérifier les contraintes?

La copie en bloc a échoué. L'utilisateur n'a pas l'autorisation ALTER TABLE sur la table 'theTable'. ALTER autorisation TABLE est nécessaire sur la table cible d'une opération de copie en bloc si la table a des déclencheurs ou vérifier contraintes, mais 'FIRE_TRIGGERS' ou 'CHECK_CONSTRAINTS' conseils en vrac ne sont pas spécifié comme options à la copie en bloc commande .

J'ai lu la documentation et créé l'essentiel objet de copie avec le constructeur qui me permet de préciser les choses:

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

Mais cela ne change rien - je reçois le même message d'erreur comme avant. J'ai essayé de jouer avec certaines des autres valeurs de SqlBulkCopyOptions mais pas de chance. Je pensais vraiment que cela réglerait le problème, ai-je oublié quelque chose?

J'ai testé la procédure après avoir accordé ALTER sur la table à mon utilisateur, et l'opération a réussi. Cependant, ce n'est pas une option pour ma situation.

Répondre

22

Résolu! On dirait que j'ai besoin d'un rappel sur les drapeaux enums. J'ai été ANDing biting les valeurs enum quand j'aurais dû les ORing.

SqlBulkCopyOptions.FireTriggers & SqlBulkCopyOptions.CheckConstraints 

évalue à zéro (ce qui équivaut à SqlBulkCopyOptions.Default.)

SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints 

correctement travaillé et a permis de l'insert en vrac à remplir.

+0

Juste appel. Oops! – gbn

+1

Je ne savais pas que ces options existaient mais quelques recherches créatives m'ont amené ici. Résolu mon problème avec SqlBulkCopy dans une table avec des triggers * sans * avoir à donner mes permissions SQL ALTER TABLE! – madannes

2

possibilités seulement, je suis désolé

documentation SQL pour BULK INSERT spécifie 3 cas où ALTER TABLE est nécessaire. Vous avez énuméré 2 d'entre eux. L'option KeepIdentity est-elle définie, même si elle n'est pas nécessaire?

Une autre option est que le déclencheur sur la table est déjà désactivé, ce qui porte à confusion. Utilisez ALTER TABLE dbo.SomeTable ENABLE TRIGGER ALL pour vous assurer activé.

+0

Merci pour les conseils gbn, je les ai essayés avant que je réalise la réponse (voir ci-dessous.) –

Questions connexes