2009-04-20 6 views
0

J'essaie d'effectuer une validation de requête SQL par programmation en C# (sans invoquer la base de données actuelle). Essentiellement, j'aimerais qu'un utilisateur puisse entrer une vue, un UDF ou un SP et que ses dépendances soient validées immédiatement. L'utilisateur les entrerait dans un outil personnalisé pour définir les objets de base de données.Obtient des dépendances à partir de la requête SQL

Ainsi, si un utilisateur est entré:

CREATE VIEW someView AS SELECT name, address FROM users 

je pourrais sortir de la dépendance des « utilisateurs » puis vérifiez contre mes collections d'objets de base de données qui sont stockées dans la mémoire (par exemple, les tables, vues, etc. ..) pour s'assurer que la dépendance existe dans l'un d'entre eux. Gardez à l'esprit les vues réelles/UDF/SP entrées dans mon application personnalisée sont très complexes et l'analyse moi-même n'est pas souhaitable. J'essaie actuellement de le faire en utilisant Microsoft.Data.Schema.ScriptDom.Sql.TSql100Parser. Cela fournit une méthode d'analyse qui renvoie une représentation DOM de la requête. Cependant, c'est un DOM terriblement complexe et je dois essentiellement écrire un analyseur complet juste pour cela.

Des idées/des suggestions? Merci!

+0

donc vous voulez juste tirer les objets être utilisé dans la requête? – IEnumerator

Répondre

2

Il existe un processus que vous pouvez utiliser nommé sp_depends ... mais il ne s'agit pas d'un système de sécurité intrinsèque en raison de la résolution de noms différée. Il n'y a vraiment aucun moyen sûr de le faire, il a obtenu un peu mieux dans les dernières versions, mais encore une douleur dans le cou

lire ce Do you depend on sp_depends (no pun intended) pour voir ce que je veux dire

+0

Merci pour la réponse, mais je voudrais le faire sans invoquer le serveur SQL. L'utilisation de sp_depends ne l'exigerait-elle pas? – manu08

+0

@ manu08: Comment voulez-vous que l'affichage crée du texte sans invoquer le serveur sql? En dehors de cela, sp_depends ne fonctionne pas avec des requêtes complexes (et pas avec des requêtes simples non plus). –

Questions connexes