簡體   English   中英

SQL 服務器 2019 - 服務器主體“sa”無法在當前安全上下文下訪問數據庫“DB_NAME”

[英]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 時出錯:

https://learn.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms188304(v=sql.105)?redirectedfrom=MSDN

當使用 EXECUTE AS USER 語句模擬主體時,或在數據庫范圍的模塊中使用 EXECUTE AS 子句時,默認情況下模擬的 scope 僅限於數據庫。 這意味着引用數據庫 scope 之外的對象將返回錯誤。

選項解決錯誤“服務器主體“sa”無法在當前安全上下文下訪問數據庫“DB_NAME””

注意:在下面的選項中,將{{TargetDb}}替換為實際的 DB_NAME

  1. 將目標數據庫所有者更改為sa
USE {{TargetDb}} 
sp_changedbowner 'sa'
  1. 或者打開目標數據庫中的TRUSTWORTHY屬性:
ALTER DATABASE {{TargetDb}} SET TRUSTWORTHY ON

刪除WITH EXECUTE AS owner

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM