2011-02-02 8 views
6

Ho usato un database SQLite e esegue un'istruzione SPIEGARE prima di eseguire la query effettiva per verificare se ci fosse qualche tentativo di scrivere sul database.qual è l'equivalente di EXPLAIN modulo SQLite in SQL Server?

Ora, abbiamo migrato a SQL Server e ho bisogno di sapere se una query cerca di scrivere sul database o è solo una semplice istruzione SELECT. Praticamente cerco di evitare qualsiasi affermazione malevola.

+4

Qualsiasi motivo per cui non si esegue semplicemente la query con un ruolo utente/ruolo/applicazione che non dispone di autorizzazioni DML/DDL? –

+0

Infatti; come dice Damien, con SQL Server la strada da percorrere è semplicemente creare un utente che non può scrivere sul database e usarlo. Cercare di fare cose intelligenti con l'analisi dei piani di query è follemente complicato e soggetto a problemi di confronto. –

risposta

8

si può vedere il piano di query stimato di tutte le query in SQL Server Management Studio facendo clic sul pulsante stimato piano di query.

Vedi MSDN.


Tuttavia, se l'utente non deve scrivere nel database, non dovrebbe disporre delle autorizzazioni per farlo. Assicurarsi che appartenga a un ruolo con autorizzazioni limitate.

3

Se si decide di seguire questa strada, si potrebbe procedere come segue:

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

Ciò restituirà 3 set di risultati che contengono una singola colonna di XML. Il secondo set di risultati è il piano di query per la query effettiva (in questo caso, select * from sysobjects)

Tuttavia, come notato nel mio commento, sarebbe meglio impedire all'utente di disporre delle autorizzazioni per apportare eventuali modifiche.

E 'anche possibile per le imbarcazioni dichiarazioni che sono "solo" seleziona, ma che sono anche piuttosto dannoso. Potrei facilmente scrivere una selezione che blocca esclusivamente ogni tabella nel database e impiega un'ora per essere eseguita.

+0

E 'un modo migliore di GUI se per qualche motivo si può eseguire solo le query sul server remoto! –