微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server 2019-服务器主体``sa''在当前安全上下文下无法访问数据库``DB_NAME''

如何解决SQL Server 2019-服务器主体``sa''在当前安全上下文下无法访问数据库``DB_NAME''

我编写了以下存储过程:

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角色。

任何想法我该如何解决错误

解决方法

删除WITH EXECUTE AS owner

,

检查目标数据库所有者,如果数据库所有者不是sa或目标数据库的TRUSTWORTHY属性为 OFF ,您将收到“服务器主体通过在存储过程中使用EXECUTE AS来模拟SA时,“ 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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。