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