显示计划安全性
可以通过多种方式生成显示计划执行计划信息。可以使用 Transact-SQL SET 语句选项和 SQL Server Profiler 事件类,也可以查询动态管理函数 sys.dm_exec_query_plan。每种方法都需要一组不同的权限,下列各节说明了这些权限。有关如何检查 Transact-SQL 批处理的 SHOWPLAN 权限的详细信息,请参阅 SHOWPLAN 权限和 Transact-SQL 批处理。
注意 |
---|
如果通过使用 sp_dbcmptlevel 存储过程将 SQL Server 数据库兼容级别设置为 80,则当前 SHOWPLAN 权限仍可应用。将兼容级别设置为 80 不会生成 Microsoft SQL Server 2000 的显示计划权限行为。 |
关于 SHOWPLAN 权限
若要使用显示计划的 Transact-SQL SET 选项生成执行计划输出,用户必须拥有下列权限:
对包含 Transact-SQL 语句中所引用对象(如视图、存储过程或用户定义函数)的数据库具备 SHOWPLAN 权限。
执行 Transact-SQL 语句本身所需的相应权限。
安全说明 拥有 SHOWPLAN、ALTER TRACE 或 VIEW SERVER STATE 权限的用户可以对显示计划输出中捕获的查询进行查看。这些查询可能包含敏感信息,例如密码。因此,建议您仅将这些权限授予有权查看敏感信息的一类用户,例如 db_owner 固定数据库角色的成员或 sysadmin 固定服务器角色的成员。同时建议您最好将包含显示计划相关事件的显示计划文件或跟踪文件保存到使用 NTFS 文件系统的某个位置,并且只允许有权查看敏感信息的用户对之进行访问。
例如,请看以下查询:
SELECT COUNT(*)
FROM table_1
WHERE column_1 < 10
如果某个恶意用户像此示例一样为一组查询生成显示计划输出,并且每次使用不同的常量替换谓词中的值“10”,则该用户就可以通过读取估计行计数推断 table_1 中的 column_1 列值的大概的数据分布情况。
SHOWPLAN 权限是数据库级权限,该权限:
仅由下列用户授予、拒绝或撤消:
sysadmin 固定服务器角色的成员。默认情况下,此固定服务器角色的所有成员都对服务器上所有数据库具备 SHOWPLAN 权限。
创建并因而拥有数据库的 dbcreator 固定服务器角色的成员。默认情况下,此固定服务器角色的所有成员都对他们自己创建并因而拥有的数据库具备 SHOWPLAN 权限。
拥有其数据库的 db_owners 固定角色服务器的成员。默认情况下,此固定服务器角色的所有成员都对他们所拥有的数据库具备 SHOWPLAN 权限。
支持所有权链接。如果断开了所有权链,将在发生中断的节点处再次检查权限。但是,由于 SHOWPLAN 权限是数据库级权限,因此只有当查询引用两个或多个数据库中的对象时才会执行此检查。有关所有权链接的详细信息,请参阅所有权链。
有关用于授予、拒绝或撤消 SHOWPLAN 权限的语法的详细信息,请参阅授予、拒绝和撤消 SHOWPLAN 权限的语法。
示例
如果用户 1 拥有 CREATE TABLE、INSERT 和 SELECT 权限,并且他在数据库 D 中创建了表 T(他是表的所有者),并向该表中插入了行,然后基于该表编写了 SELECT 查询,则该查询会成功执行。但是,除非用户 1 被授予数据库 D 的 SHOWPLAN 权限,否则他不能生成显示计划。
警告
在上一示例中,假设数据库 D 包含视图 V,用户 1 具有该视图的 SELECT 权限。授予 User1 对 D 的 SHOWPLAN 权限后,尽管该用户没有视图 V 的所有权,但仍可以基于 V 的查询生成显示计划。此显示计划使他能够看到 V 的视图定义,包括 V 所基于的表和视图。但是,如果视图 V 包含对象(如表,用户 1 具有该表的所有权且该表存在于一个不同的数据库 D2 中,而用户 1 却不是数据库 D2 的所有者),则必须检查 D2 的 SHOWPLAN 权限。
使用显示计划的 SET 选项所需要的权限
下表列出了使用各种显示计划的 SET 语句选项所需要的权限:
显示计划的 SET 选项 |
所需权限 |
---|---|
SET SHOWPLAN_XML ON SET SHOWPLAN_ALL ON SET SHOWPLAN_TEXT ON |
对于 SELECT、INSERT、UPDATE、DELETE、EXEC stored_prodedure 以及 EXEC user_defined_function 语句,必须拥有下列权限才能生成显示计划:
对于所有其他语句(如 DDL、USE database_name、SET、DECLARE、动态 Transact-SQL 等),只需具备执行 Transact-SQL 语句的相应权限。有关详细信息,请参阅 SHOWPLAN 权限和 Transact-SQL 批处理。 |
SET STATISTICS XML ON SET STATISTICS PROFILE ON |
对于不生成 STATISTICS PROFILE 或 STATISTICS XML 结果集的 Transact-SQL 语句,只需要执行 Transact-SQL 语句所需要的相应权限。对于生成 STATISTICS PROFILE 或 STATISTICS XML 结果集的 Transact-SQL 语句,必须成功检查 Transact-SQL 语句执行权限和 SHOWPLAN 权限,否则将中止执行 Transact-SQL 语句,并且不会生成任何 SHOWPLAN 信息。有关生成显示计划信息的 Transact-SQL 语句的信息,请参阅用于生成显示计划的 Transact-SQL 语句。 |
SET STATISTICS TIME SET STATISTICS IO |
这些 SET 语句选项都不检查 SHOWPLAN 权限,也不需要 SHOWPLAN 权限。 |
何时检查 SHOWPLAN 权限?
当 Transact-SQL 语句或批处理执行时将检查 SHOWPLAN 权限,并生成显示计划信息。但是,当某个显示计划的 SET 选项设置为 ON 时,就不会进行检查。
注意 |
---|
通过使用 USE <database_name> 语句可设置 Transact-SQL 批处理的上下文数据库。不对 USE <database_name> 语句检查 SHOWPLAN 权限,也不对上下文数据库检查该权限。 |
有关显示计划的 SET 语句选项的详细信息,请参阅下列主题:
使用 SQL Server Management Studio 显示图形执行计划所需要的权限
下表列出了在 SQL Server Management Studio 中显示图形执行计划所需要的权限:
Management Studio 执行计划选项 |
所需权限 |
---|---|
显示估计的执行计划 |
需要与使用 SHOWPLAN_XML SET 语句选项所需权限一样的权限 |
包含实际的执行计划 |
需要与使用 STATISTICS XML SET 语句选项所需权限一样的权限 |
有关详细信息,请参阅显示图形执行计划 (SQL Server Management Studio)。
使用 SQL Server Profiler 事件类显示执行计划所需要的权限
若要使用 SQL Server Profiler 事件类显示执行计划,用户必须为 sysadmin 固定服务器角色的成员,或被授予 ALTER TRACE 权限。不检查 SHOWPLAN 权限,也不需要该权限。
有关详细信息,请参阅使用 SQL Server Profiler 事件类显示执行计划。
使用 sys.dm_exec_query_plan 动态管理函数显示执行计划所需要的权限
若要使用 sys.dm_exec_query_plan 动态管理函数显示执行计划,必须仅授予用户 VIEW SERVER STATE 权限。
有关详细信息,请参阅 sys.dm_exec_query_plan。