Sql server SQL Server 2019-服务器主体;sa";“无法访问数据库”;DB_NAME";在当前的安全环境下

Sql server SQL Server 2019-服务器主体;sa";“无法访问数据库”;DB_NAME";在当前的安全环境下,sql-server,sql-server-2019,database-security,Sql Server,Sql Server 2019,Database Security,我编写了以下存储过程: 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 ' + ' '

我编写了以下存储过程:

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>'
使用master
去
执行usp_演示“
我从SQL Server 2019 STD版(RTM-CU6)(KB4563110)中的
Master
运行时,出现以下错误:

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

其想法是使用存储过程将登录映射到数据库,并赋予
db\u所有者
角色


知道如何解决错误吗?

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

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

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

注意:在下面的选项中,将{{TargetDb}}替换为实际的DB_名称

  • 将目标数据库所有者更改为
    sa
  • 或者打开目标数据库中的
    可信
    属性:

  • 您好,马库斯,谢谢您的回复,但是,实际上我们的想法是使用execute来运行命令谢谢!事实上我已经尝试了两种解决方案,但都没有成功!:(可能是2019年的某种限制?
    ALTER DATABASE {{TargetDb}} SET TRUSTWORTHY ON