如何解决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”:
使用EXECUTE AS USER语句模拟主体时,或使用EXECUTE AS子句模拟数据库范围的模块时,默认情况下,模拟范围仅限于数据库。这意味着对数据库范围之外的对象的引用将返回错误。
选项可解决错误“服务器主体“ sa”在当前安全上下文下无法访问数据库“ DB_NAME”” :
注意:在以下选项中,将 {{TargetDb}} 替换为实际的DB_NAME
- 将目标数据库所有者更改为
sa
USE {{TargetDb}}
sp_changedbowner 'sa'
- 或打开目标数据库中的
TRUSTWORTHY
属性:
ALTER DATABASE {{TargetDb}} SET TRUSTWORTHY ON
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。