与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 */
这可能吗?
答案 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帐户。