在SQL Server中,与SQLite中的EXPLAIN相当的是什么?

6

我使用了SQLite数据库,在执行实际查询之前运行了一个EXPLAIN语句,以验证是否有任何尝试写入数据库的操作。

现在,我们已经迁移到SQL Server,我需要知道查询是否尝试写入数据库,还是只是一个简单的SELECT语句。我基本上试图避免任何恶意语句。


4
为什么不使用一个没有DML/DDL权限的用户/角色/应用程序角色来运行查询? - Damien_The_Unbeliever
正如Damien所说,使用SQL Server的方法就是简单地创建一个不能写入数据库的用户,并使用该用户。相比之下,尝试使用分析查询计划来做聪明的事情是非常复杂和有问题的。 - Matt Gibson
2个回答

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的结果集。第二个结果集是实际查询的查询计划(在本例中为select * from sysobjects)。
但正如我在评论中指出的那样,最好防止用户具有进行任何更改的权限。
还可以制作“仅”选择但也相当恶意的语句。我可以轻松编写一个仅锁定数据库中每个表并需要一个小时才能运行的选择。

如果由于某些原因你只能在远程服务器上执行查询,那么这比GUI更好的方式! - Nikolay Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接