SHOWPLAN 权限和 Transact-SQL 批处理

Transact-SQL 批处理包含一个或多个语句。本主题介绍当对 Transact-SQL 批处理使用 Showplan SET 语句选项时,SQL Server 如何按照各个语句选项执行 SHOWPLAN 权限检查。

安全说明安全说明

拥有 SHOWPLAN、ALTER TRACE 或 VIEW SERVER STATE 权限的用户可以对显示计划输出中捕获的查询进行查看。这些查询可能包含敏感信息,例如密码。因此,建议您仅将这些权限授予有权查看敏感信息的一类用户,例如 db_owner 固定数据库角色的成员或 sysadmin 固定服务器角色的成员。同时建议您最好将包含显示计划相关事件的显示计划文件或跟踪文件保存到使用 NTFS 文件系统的某个位置,并且只允许有权查看敏感信息的用户对之进行访问。

包含 USE 或 SET 语句的批处理

对于 USE 语句或 SET 语句,不按照任何显示计划的 SET 选项(SHOWPLAN_TEXT、SHOWPLAN_ALL、SHOWPLAN_XML、STATISTICS PROFILE 或 STATISTICS XML)执行显示计划权限检查。对于生成预计的执行计划输出的 SHOWPLAN_TEXT、SHOWPLAN_ALL 和 SHOWPLAN_XML,将按照这些 Showplan SET 选项执行 USE database_name 语句,除此之外,不执行此批处理中的任何其他 Transact-SQL 语句。

SHOWPLAN 权限检查示例

上下文数据库可以使用 USE database_name 语句分批设置。对包含 Transact-SQL 语句中引用的对象(例如表或视图)的数据库会执行 SHOWPLAN 权限检查。但是,只有在 Transact-SQL 语句引用了上下文数据库中的对象时,才会对上下文数据库执行 SHOWPLAN 权限检查。

如果某个批处理包含 USE database_name 语句,则上下文数据库会发生变化。在这种情况下,则不对某个批处理中出现特定语句时有效的上下文数据库执行 SHOWPLAN 权限检查。

例如,在下面的批处理中,对两个 SELECT 语句所涉及的 AdventureWorks2008R2 数据库执行 SHOWPLAN 权限检查。但不对 master 或 tempdb 数据库(在 USE 语句中引用了这两个数据库)执行 SHOWPLAN 权限检查:

SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks2008R2.Person.Address
USE master
SELECT * FROM AdventureWorks2008R2.Person.Address
GO

动态 SQL 的 SHOWPLAN 权限检查

  • 对于 EXEC (command_string) 或 EXEC (character_string) 形式的动态 SQL 语句,不对该语句(包括嵌入字符串)执行 SHOWPLAN 权限检查。

  • 对于执行 EXEC dbo.my_stored_procedure 形式的存储过程的动态 SQL 语句,不对 EXEC 语句本身执行 SHOWPLAN 权限检查。但是,由于是针对整个存储过程主体生成 Showplan,因此,会对包含存储过程中语句引用的对象的数据库执行 SHOWPLAN 权限检查。

下面的示例说明了如何对动态 SQL 语句执行 SHOWPLAN 权限检查。将对 SELECT 语句所涉及的 AdventureWorks2008R2 数据库执行 SHOWPLAN 权限检查,而对 EXEC 语句本身、tempdb 数据库或 master 数据库不执行 SHOWPLAN 权限检查:

SET SHOWPLAN_XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');

下面的示例使用了 SET STATISTICS XML,如果将批处理发送到 master 数据库,将不按照 SET 语句执行 SHOWPLAN 权限检查。对 USE tempdb 语句不会检查 SHOWPLAN 权限。但是,由于对 USE 语句执行 CONNECT 权限检查,因此用户必须已经存在于 tempdb 数据库中并对 tempdb 数据库具有 CONNECT 权限。EXEC 语句不会生成任何 Showplan 输出,所以不对该语句执行 SHOWPLAN 权限检查。对 USE master 语句不会检查 SHOWPLAN 权限。但对 SELECT 语句所涉及的 AdventureWorks2008R2 数据库执行 SHOWPLAN 权限检查:

SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks2008R2.Person.Address');
注意注意

对于引用先前版本的 SQL Server 的查询,不执行 SHOWPLAN 权限检查。但会对在 SQL Server 2005 及更高版本上运行的部分此类查询执行 SHOWPLAN 权限检查。

包含错误的批处理

如果对生成语句执行错误或权限检查错误的 Transact-SQL 批处理使用某个 Showplan SET 语句选项,则上下文数据库取决于所用的 SET 选项,如下所示:

  • SHOWPLAN_TEXT、SHOWPLAN_ALL 和 SHOWPLAN_XML

    开始执行批处理之前的有效上下文数据库仍为有效数据库。如果遇到语句执行或权限检查错误,则整个批处理中不会生成 Showplan 输出。必须成功执行所有权限检查和语句,才会生成 Showplan 输出。

  • STATISTICS PROFILE 和 STATISTICS XML

    成功执行最后一个语句时的有效上下文数据库仍为有效数据库。在成功执行了其中的语句并成功检查了权限的批处理中,对于每个语句都生成 Showplan 输出。对批处理中成功执行和成功对其检查权限的每个语句都生成 Showplan 输出。

请参阅

概念