2011-02-02 2 views
6

Я использовал базу данных SQLite и запускал оператор EXPLAIN перед выполнением фактического запроса, чтобы проверить, была ли попытка записи в базе данных.Что эквивалентно форме EXPLAIN SQLite в SQL Server?

Теперь мы перешли на SQL Server, и мне нужно знать, пытается ли запрос писать в базе данных или просто простая инструкция SELECT. Я в основном стараюсь избегать любого злонамеренного заявления.

+4

Любая причина, по которой вы не просто запускаете запрос с ролью пользователя/роли/приложения, которая не имеет разрешений DML/DDL? –

+0

Действительно; как говорит Дэмиен, с SQL Server путь - просто создать пользователя, который не может писать в базу данных, и использовать его. Попытка сделать умные вещи с анализом планов запросов является безумно сложной и подверженной ошибкам в сравнении. –

ответ

8

Вы можете увидеть оценочный план запроса любого запроса в SSMS, щелкнув по кнопке плана предполагаемого запроса.

См. MSDN.


Однако, если пользователь не должен писать в базу данных, у него не должно быть разрешений. Убедитесь, что он принадлежит роли, которая имеет ограниченные разрешения.

3

Если вы решили пойти по этому пути, вы можете сделать следующее:

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

Это вернет 3 результирующие наборы, содержащие один столбец XML. 2-й результирующий набор - это план запроса для фактического запроса (в данном случае select * from sysobjects)

Но, как отмечено в моем комментарии, вам было бы лучше не дать пользователю разрешений внести какие-либо изменения.

Также можно создавать заявления, которые выбираются только «только», но которые также являются довольно вредоносными. Я мог бы легко написать выбор, который блокирует каждую таблицу в базе данных и занимает один час.

+0

Это лучший способ, чем графический интерфейс, если по какой-то причине вы можете выполнять запросы только на удаленном сервере! –