[英]The server principal “sa” is not able to access the database “model” under the current security context
[英]SQL Server 2019 - The server principal "sa" is not able to access the database "DB_NAME" under the current security context
我寫了以下存儲過程:
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 Edition (RTM-CU6) (KB4563110) 中從Master
運行,但出現此錯誤:
Msg 916, Level 14, State 2, Line 14
服務器主體“<OWNER_LOGIN>”無法在當前安全上下文中訪問數據庫“<DB_NAME>”。
這個想法是使用存儲過程 map 登錄數據庫並賦予db_owner
角色。
知道如何解決錯誤嗎?
檢查目標數據庫所有者,如果數據庫所有者不是sa
或目標數據庫的TRUSTWORTHY
屬性為OFF ,您將收到“服務器主體“sa”無法在當前安全上下文下訪問數據庫“DB_NAME”” " 在存儲過程中使用EXECUTE AS
模擬 SA 時出錯:
當使用 EXECUTE AS USER 語句模擬主體時,或在數據庫范圍的模塊中使用 EXECUTE AS 子句時,默認情況下模擬的 scope 僅限於數據庫。 這意味着引用數據庫 scope 之外的對象將返回錯誤。
選項解決錯誤“服務器主體“sa”無法在當前安全上下文下訪問數據庫“DB_NAME”” :
注意:在下面的選項中,將{{TargetDb}}替換為實際的 DB_NAME
sa
USE {{TargetDb}}
sp_changedbowner 'sa'
TRUSTWORTHY
屬性:ALTER DATABASE {{TargetDb}} SET TRUSTWORTHY ON
刪除WITH EXECUTE AS owner
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.