【问题标题】:SQL Server 2019 - The server principal "sa" is not able to access the database "DB_NAME" under the current security contextSQL Server 2019 - 服务器主体“sa”无法在当前安全上下文下访问数据库“DB_NAME”
【发布时间】:2020-09-01 23:57:20
【问题描述】:

我写了以下存储过程:

CREATE PROCEDURE dbo.usp_DEMO 
    @LOGINSQL VARCHAR(30), 
    @DBNAME VARCHAR(40) 
WITH EXECUTE AS owner
AS 
    DECLARE @SQL NVARCHAR(1000) 
    SET @SQL = 'USE' 
    SET @SQL = @SQL + ' ' + @DBNAME + ' ' + ' CREATE USER ' + ' ' 
               + @LOGINSQL + ' ' + ' FOR LOGIN ' + ' ' + @LOGINSQL + ' ' 
               + ' ALTER ROLE [DB_OWNER] ADD MEMBER ' + ' ' 
               + @LOGINSQL 
    EXEC sp_executesql @SQL

这样运行:

use master
go
exec usp_DEMO '<LOGIN>','<DATABASE>'

我在 SQL Server 2019 STD 版 (RTM-CU6) (KB4563110) 中从 Master 运行,我收到此错误:

消息 916,第 14 级,状态 2,第 14 行
服务器主体“”无法在当前安全上下文下访问数据库“”。

这个想法是使用存储过程将登录映射到数据库并赋予db_owner 角色。

知道如何解决这个错误吗?

【问题讨论】:

    标签: sql-server sql-server-2019 database-security


    【解决方案1】:

    检查目标数据库所有者,如果数据库所有者不是sa 或目标数据库的TRUSTWORTHY 属性为OFF,您将收到“服务器主体“sa”为在存储过程中使用 EXECUTE AS 模拟 SA 时无法在当前安全上下文下访问数据库“DB_NAME”错误:

    https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms188304(v=sql.105)?redirectedfrom=MSDN:

    使用 EXECUTE AS USER 语句模拟主体时,或使用 EXECUTE AS 子句在数据库范围的模块中模拟主体时,默认情况下模拟范围仅限于数据库。这意味着对数据库范围之外的对象的引用将返回错误。

    选项解决错误“服务器主体“sa”无法在当前安全上下文下访问数据库“DB_NAME”

    注意:在以下选项中,将 {{TargetDb}} 替换为实际的 DB_NAME

    1. 将目标数据库所有者更改为sa
    USE {{TargetDb}} 
    sp_changedbowner 'sa'
    
    1. 或者在目标数据库中开启TRUSTWORTHY属性:
    ALTER DATABASE {{TargetDb}} SET TRUSTWORTHY ON
    

    【讨论】:

    • 谢谢!实际上我已经尝试了这两种解决方案,但都没有奏效! :( 2019 年可能会有某种限制?
    【解决方案2】:

    删除WITH EXECUTE AS owner

    【讨论】:

    • 嗨,马库斯,感谢您的回复,但实际上这个想法是使用执行来运行命令
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    • 2010-10-07
    • 2018-03-29
    相关资源
    最近更新 更多