2010-11-20 6 views
2

Matin SO.Comment déterminer si une requête SQL est un SELECT?

EDIT

Je voudrais faire une validation des requêtes SQL pour vérifier que cette requête est une commande SELECT et non un UPDATE ou DELETE ou une instruction INSERT ou toute déclaration bizarre sql.

Je sais que la meilleure façon est de faire correspondre "^ SELECT" MAIS:

  • une requête peut commencer par "(" comme

    (SELECT * FROM blah WHERE id> 1 LIMITE 3) UNION (SELECT * ...)

  • une requête peut commencer par "aVEC RÉCURSIVE"

    aVEC cte récursive (SELECT * FROM blah)

Je voudrais déterminer si une requête SQL est un SELECT. Eh bien, je ne sais pas s'il y a des requêtes bizarres que je dois savoir avant d'écrire une regexp.

Toute aide est appréciée.

EDIT: Je veux vérifier si elle est une PURE requête de sélection :)

+0

Quelle saveur de SQL essayez-vous d'analyser? Différents fournisseurs offrent une syntaxe et des options différentes, bien que votre exemple semble être un CTE sur SQL Server. – Oded

+0

il ne peut pas être spécifique au vendeur – dzen

+0

semble que ce n'est pas spécifique à SQL Server: http://www.davidcramer.net/code/django/6939/scaling-threaded-comments-on-django-at-disqus.html – dzen

Répondre

1

Vous pouvez également faire statemtents de mise à jour qui exécutent leurs propres SELECTs l'intérieur pour trouver des données pour mettre à jour, ou bien d'autres façons d'intégrer des déclarations dans l'autre ... En supposant que vous n'utilisez pas "SELECT" car les données ou les noms de champs n'exécutent qu'une expression rationnelle pour /\bselect\b/i sinon vous aurez besoin d'un analyseur complet.

Modifier: également: /\b(insert|update)\b/i inverser cela pour s'assurer qu'il n'y en a aucun d'entre eux.

+0

Non, cette requête doit être un SELECT pur. Je veux dire que ce ne peut pas être une mise à jour, un insert ou whatelse. – dzen

+0

Eh bien, vous pouvez tout aussi bien ajouter une mise à jour d'insert ou une requête whatelse à l'intérieur d'un select ... Exécutez simplement/\ b (insert | update) \ b/i' avec des options supplémentaires et inversez la sortie. –

+3

Ce qui suit est techniquement autorisé dans SQL Server 'create table [insert] ([update] int); insérer dans les valeurs [insert] (1); sélectionnez [update] from [insert] ' –

-1

si la requête commence par le mot « select » (insensible à la casse), il est une requête de sélection

+1

Non, SELECT peut commencer par" (SELECT) "comme je l'ai dit. Je voudrais savoir s'il y a plus de possibilités. – dzen

1

La façon normale de traiter c'est avec des autorisations - vous accordez à l'utilisateur exécutant les autorisations db_reader de requêtes dans le serveur SQL, mais pas db_writer ou autre chose. Ensuite, vous gérez l'erreur/exception si la requête échoue.

Questions connexes