当用户要执行一个复杂的存储过程时,其中有相当多的表/视图甚至另一个存储过程。
我的问题是:
SQL Server在生成执行计划之前,是否检查用户的权限?
否则,如果用户首先没有EXEC
对该存储过程的权限,则生成执行计划本身就是一种间接成本。
如果是,在我看来,SQL Server 引擎没有任何消耗品,即没有安全标识符(如存储过程本身、存储过程中的表等)SQL Server 引擎可以用来检查用户权限. 至少在解析完成之前,不会生成所有这些安全标识符。
那么从执行存储过程的生命周期角度来看,SQL Server 权限检查何时开始?
这在此处详细说明:
https://learn.microsoft.com/en-us/sql/relational-databases/security/permissions-database-engine
但基本的答案是存储过程已经缓存并重用了查询计划,当从存储过程访问存储过程所有者拥有的对象时,权限检查不是必需的。如果过程和要访问的对象之间存在有效的所有权链,则在启动存储过程之前只检查 EXECUTE 权限。跳过其他权限检查。
这里要记住的主要事情是,批处理中的所有查询在任何查询开始执行之前都会被解析和编译。在执行期间检查权限。甚至可以在查询中以从未实际检查该表的权限的方式引用表。
如果您观看这样的 XE 会话:
并做类似的事情
然后:
您会看到第一批中的查询计划都已编译,然后第一个查询运行,然后第二个查询失败。第三个查询在没有权限检查的情况下成功。