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

时间:2015-03-03 16:06:23

标签: sql sql-server tsql

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

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

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

这可能吗?

1 个答案:

答案 0 :(得分:2)

它不像你的要求那样起作用。将EXECUTE AS运行到存储过程时,该配置是存储过程编译的一部分,因此无法动态绑定到变量。

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

使用示例进行更新

这是我在本地实例上做的快速处理。我通过Windows身份验证连接时运行代码,但使用动态sql创建proc强制它作为我的本地SQL帐户执行。 proc很简单,它只是输出运行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帐户。