Question

J'utilisé une base de données SQLite et exécuter une instruction avant d'exécuter la EXPLIQUEZ requête réelle afin de vérifier s'il y avait une tentative d'écriture sur la base de données.

Maintenant, nous avons migré vers SQL Server et je dois savoir si une tente de requête pour écrire sur la base de données ou est juste une simple instruction SELECT. J'essaie essentiellement d'éviter toute déclaration malveillante.

Était-ce utile?

La solution

Vous pouvez voir le plan de requête estimé d'une requête en SSMS en cliquant sur le bouton plan de requête estimé.

Voir MSDN .


Cependant, si l'utilisateur ne doit pas être en train d'écrire à la base de données, est ne devrait pas avoir les autorisations nécessaires pour le faire. Assurez-vous qu'il appartient à un rôle qui a des autorisations limitées.

Autres conseils

Si vous décidez d'emprunter cette voie, vous pouvez faire ce qui suit:

set showplan_xml on
go
set noexec on
go
select * from sysobjects
go
set noexec off
go
set showplan_xml off
go

Ceci renvoie 3 jeux de résultats contenant une seule colonne de XML. L'ensemble 2e résultat est le plan de requête pour la requête réelle (dans ce cas, select * from sysobjects)

Mais comme il est indiqué dans mon commentaire, vous feriez mieux de prévenir l'utilisateur ayant des autorisations pour effectuer des modifications.

Il est également possible aux déclarations d'artisanat qui sont « seulement », mais qui sont choisit aussi assez malveillant. Je pourrais facilement écrire un sélectionner qui verrouille exclusivement toutes les tables dans la base de données et prend une heure à courir.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top