2009-05-22 8 views
4

J'écris un travail planifié pour imiter un plan de maintenance SQL Server pour SQL Express. (Je dois le faire car SQL Agent et les outils associés n'existent pas pour SQL Express)Puis-je exécuter DBCC CHECKDB à partir de .NET?

L'une des étapes consiste à effectuer une vérification de l'intégrité de la base de données. Le TSQL pour cela est:

DBCC CHECKDB(N'Northwind') WITH NO_INFOMSGS 

Comment puis-je savoir si une erreur est survenue lors de l'exécution de cette commande, sera-t lancer une Exception lors de l'utilisation ADO.NET ou devrais-je analyser le sortie de texte

Ceci est difficile à tester car je n'ai pas de base de données corrompue à portée de main.

Répondre

3

Oui Je crois que vous devez traiter la sortie de texte renvoyée par DBCC CHECKDB.

Pour vous aider dans vos tests, la référence suivante détaille comment altérer délibérément une base de données SQL Server.

http://sqlblogcasts.com/blogs/tonyrogerson/archive/2007/03/10/how-to-create-a-corrupt-database-using-bulk-insert-update-and-bcp-sql-server-as-a-hex-editor.aspx

+0

Merci pour l'URL sur la façon de corrompre une base de données, c'est vraiment utile. –

+0

De rien! –

2

Vous pouvez utiliser l'option TABLERESULTS avec CHECKDB (DBCC CHECKDB WITH TABLERESULTS). Cela vous donnera un jeu d'enregistrements avec des colonnes comme Error, Level, State, MessageText (parmi beaucoup d'autres).

La colonne Level (niveau de gravité) de ce jeu d'enregistrements doit être suffisante pour déterminer s'il y a une erreur. MS dit que les niveaux 11 à 16 sont "générés par l'utilisateur, et peuvent être corrigés par l'utilisateur". Je dirais donc que tout ce qui est au-dessus de 17 devrait signifier: arrêtez de faire des sauvegardes (pour éviter d'écraser de bonnes sauvegardes avec des sauvegardes cassées), déconnectez le système si possible et notifiez immédiatement un opérateur.

Et les niveaux 11 à 16 devraient probablement être signalés à l'opérateur aussi bien (par l'intermédiaire de l'email régulier ou de n'importe quoi), ainsi il peut vérifier dedans si nécessaire. (Je ne sais pas si CHECKDB sera jamais signaler une erreur avec des niveaux 11 à 16 tout en ayant le code là pour enregistrer l'erreur/notifier un opérateur ne sera probablement pas mal si..)

NOTE: si vous combinez TABLERESULTS avec NO_INFOMSGS, et si CHECKDB ne trouve pas les erreurs, vous pas obtenez tout recordset en conséquence, pas même un sans lignes.

NOTE2: Dans certaines conditions, CHECKDB échouera simplement avec un code d'erreur. Jusqu'à présent, je ne l'ai vu une erreur qui déclenche cela, et il ressemble à ceci:

Msg 211, Level 23, State 51, Line 3 
Possible schema corruption. Run DBCC CHECKCATALOG. 
Msg 0, Level 20, State 0, Line 0 
A severe error occurred on the current command. The results, if any, should be discarded. 

Je ne suis pas en utilisant beaucoup ADO.NET, mais je pense que ADO.NET va réagir en lançant une exception. En outre, comme il s'agit d'une erreur de gravité> = 20, la connexion client sera fermée.


Pour résumer tout cela: je courrais DBCC CHECKDB WITH TABLERESULTS. Si la commande échoue, il y a un problème (probablement un problème). Si ce n'est pas le cas, passez en boucle dans le jeu de résultats et recherchez les niveaux de gravité> = 17. Si vous en trouvez un, il y a probablement aussi un problème grave.

+0

Si vous souhaitez ajouter un commentaire, les messages de niveau de gravité 10 sont informatifs et indiquent les problèmes causés par des erreurs dans les informations que vous avez saisies. Les niveaux de gravité de 11 à 16 sont générés par l'utilisateur et peuvent être corrigés par l'utilisateur. Donc, je conseillerais de vérifier pour Niveaux> = 11. Et la plupart des erreurs auront réellement niveau = 16 –

+0

J'ai déjà écrit que les niveaux 11 à 16 devraient probablement être signalés à un opérateur. S'il fournit un SQL incorrect, il aura probablement une erreur dans la plage 11 ... 16. Mais alors son travail échouera toujours. Si la syntaxe est correcte cependant, je ne vois pas comment/pourquoi CHECKDB signalerait jamais une "erreur corrigible par l'utilisateur". Et même si c'est le cas, je suis sûr à 99% que ce ne sera pas parce que la base de données est endommagée. Je m'attends vraiment à un message de niveau 21+ dans ce cas. –

Questions connexes