SHOWPLAN 权限和 Transact-SQL 批处理
Transact-SQL 批处理包含一个或多个语句。本主题介绍当对 Transact-SQL 批处理使用 Showplan SET 语句选项时,SQL Server 2005 如何按照各个语句选项执行 SHOWPLAN 权限检查。
包含 USE 或 SET 语句的批处理
对于 USE 语句或 SET 语句,不按照任何 Showplan SET 选项(SHOWPLAN_TEXT、SHOWPLAN_ALL、SHOWPLAN_XML、STATISTICS PROFILE 或 STATISTICS XML)执行 SHOWPLAN 权限检查。对于生成预计的执行计划输出的 SHOWPLAN_TEXT、SHOWPLAN_ALL 和 SHOWPLAN_XML,将按照这些 Showplan SET 选项执行“USE 数据库名称”语句,除此之外,不执行批处理中任何其他 Transact-SQL 语句。
SHOWPLAN 权限检查示例
批处理中,通过使用“USE 数据库名称”语句设置上下文数据库。对包含 Transact-SQL 语句中引用的对象(例如表或视图)的数据库执行 SHOWPLAN 权限检查。但是,只有在 Transact-SQL 语句引用了上下文数据库中的对象时,才会对上下文数据库执行 SHOWPLAN 权限检查。
如果某个批处理包含“USE 数据库名称”语句,则上下文数据库会发生变化。在这种情况下,则不对某个批处理中出现特定语句时有效的上下文数据库执行 SHOWPLAN 权限检查。
例如,在下面的批处理中,对两个 SELECT 语句所涉及的 AdventureWorks 数据库执行 SHOWPLAN 权限检查,但不对 master 或 tempdb 数据库(在 USE 语句中引用了这两个数据库)执行 SHOWPLAN 权限检查:
SET SHOWPLAN_XML ON
GO
USE tempdb
SELECT * FROM AdventureWorks.Person.Address
USE master
SELECT * FROM AdventureWorks.Person.Address
GO
动态 SQL 的 SHOWPLAN 权限检查
- 对于 EXEC (命令字符串) 或 EXEC (字符串) 形式的动态 SQL 语句,不对该语句(包括嵌入字符串)执行 SHOWPLAN 权限检查。
- 对于执行 EXEC dbo.my_stored_procedure 形式的存储过程的动态 SQL 语句,不对 EXEC 语句本身执行 SHOWPLAN 权限检查。但是,由于是针对整个存储过程主体生成 Showplan,因此,会对包含存储过程中语句引用的对象的数据库执行 SHOWPLAN 权限检查。
下面的示例说明了如何对动态 SQL 语句执行 SHOWPLAN 权限检查。将对 SELECT 语句所涉及的 AdventureWorks
数据库执行 SHOWPLAN 权限检查,而对 EXEC 语句本身、tempdb
数据库和 master
数据库不执行 SHOWPLAN 权限检查:
SET SHOWPLAN_XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks.Person.Address');
下面的示例使用了 SET STATISTICS XML,如果将批处理发送到 master
数据库,将不按照 SET 语句执行 SHOWPLAN 权限检查。对 USE tempdb
语句不会检查 SHOWPLAN 权限。但是,由于对 USE 语句执行 CONNECT 权限检查,因此用户必须已经存在于 tempdb
数据库中并对 tempdb
数据库具有 CONNECT 权限。EXEC 语句不会生成任何 Showplan 输出,所以不对该语句执行 SHOWPLAN 权限检查。对 USE master
语句不会检查 SHOWPLAN 权限。但对 SELECT 语句所涉及的 AdventureWorks
数据库执行 SHOWPLAN 权限检查:
SET STATISTICS XML ON
GO
USE tempdb
EXEC ('USE master; SELECT * FROM AdventureWorks.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 输出。