运行 存储过程作为部署时确定的用户名?

Run stored procedure as username determined at deployment time?

类似于Can you set a stored procedure to always execute as a specific user?

如何将 'domain/username' 设置为部署时确定的值?每个环境的用户名可能不同,我可以读取本地 table 来获取服务用户名。

DECLARE @ServiceUsername
SELECT @ServiceUsername = [val] FROM [ConfigTable] WHERE ...
CREATE PROCEDURE dbo.spMyProc
WITH EXECUTE AS @ServiceUsername    /* fails. expects literal string */

这可能吗?

它与您的要求不完全一样。当您 运行 EXECUTE AS 进入存储过程时,该配置是存储过程编译的一部分,因此它不能动态绑定到变量。

如果将 CREATE PROC 语句转换为 NVARCHAR,则可以 运行 sp_dynamicsql 使用配置的用户名编译特定的存储过程。

更新样本

这是我在本地实例上进行的快速处理。我在通过 windows 身份验证连接时 运行 代码,但使用动态 sql 创建 proc 强制它作为我的本地 SQL 帐户执行。 proc 很简单,因为它只是输出用户 运行ning proc 以确认执行上下文。

-- Connected with windows auth (domain/jason)
DECLARE @Username VARCHAR(100) = 'jasonw'
DECLARE @SP NVARCHAR(MAX) = '
    CREATE PROC dbo.spMyProc
    WITH EXECUTE AS ''__EXEC_AS_USER__''
    AS
    BEGIN
        PRINT USER_NAME() -- Do work here
    END'
SET @SP = REPLACE(@SP, '__EXEC_AS_USER__', @Username)
EXEC sys.sp_executesql @SP
EXEC dbo.spMyProc

此代码正确输出 jasonw(本地 SQL 帐户)而不是我的 windows 帐户。