"execute as" 在本机编译的存储过程中是强制性的吗?

Is "execute as" mandatory in natively compiled stored procedures?

我注意到 本机编译的 存储过程(在 SQL 服务器中)的所有示例(我见过)都是使用 EXECUTE AS OWNER 定义的。

For example:

CREATE PROCEDURE [dbo].[InsertOrderXTP]  
    @id INT, 
    @date DATETIME2, 
    @status TINYINT  
WITH NATIVE_COMPILATION, SCHEMABINDING, EXECUTE AS OWNER  
AS...

我们在尝试执行我们使用 EXECUTE AS OWNER 创建的本机编译存储过程时开始出现以下错误:

Could not obtain information about Windows NT group/user ...

这是有道理的,因为我们与创建这些程序的用户有其他不相关的技术问题。

由于我们从未在常规(“解释”)过程中使用过 EXECUTE AS ..,我尝试将其从本机编译的存储过程中删除,它似乎工作得很好。

但正如我所提到的,它与我见过的所有示例形成对比,我找不到任何详细说明此问题的相关文档。

  1. 必须使用 EXECUTE AS OWNER..." 创建本机编译的存储过程吗?
  2. 使用 EXECUTE AS OWNER... 创建在常规(解释)存储过程中不存在的本机编译存储过程是否有好处?
  3. 在哪里可以找到有关此问题的明确文档?

这似乎是一个历史限制,自 SQL Server 2016 起不再需要。

documentation for CREATE PROCEDURE 中,我们有这条注释:

For natively compiled stored procedures, starting SQL Server 2016 (13.x) and in Azure SQL Database, there are no limitations on the EXECUTE AS clause. In SQL Server 2014 (12.x) the SELF, OWNER, and 'user_name' clauses are supported with natively compiled stored procedures.

然后在 the separate page about EXECUTE AS 上有这个:

CALLER is the default for all modules except queues, and is the same as SQL Server 2005 (9.x) behavior.

将这两件事放在一起,我们发现在 SQL Server 2014 中省略本机编译存储过程的 EXECUTE AS 子句将默认为不受支持的选项。因此,早于 SQL Server 2016 的所有本机编译存储过程示例都需要显式 EXECUTE AS 子句才能成功编译。