簡體   English   中英

服務器主體“XYuser”在當前安全上下文下無法訪問數據庫“Ydb”

[英]The server principal "XYuser" is not able to access the database "Ydb" under the current security context

系統規格

Microsoft SQL Server Management Studio          9.00.4035.00  
Microsoft Analysis Services Client Tools        2005.090.4035.00  
Microsoft Data Access Components (MDAC)         2000.085.1132.00  
                                                 (xpsp.080413-0852)  
Microsoft MSXML                                 2.6 3.0 4.0 5.0 6.0 
Microsoft Internet Explorer                     7.0.5730.13  
Microsoft .NET Framework                        2.0.50727.1433  
Operating System                                5.1.2600  

在名為BHAVMSQL02的 SQL Server 2005 上,我有兩個數據庫Mattercentre_devCMSNET_DEV Mattercentre_dev有一個存儲過程,它從CMSNET_DEV 中的表構建一個列表。 存儲過程看起來像這樣......

USE [Mattercentre_dev]
GO
/****** Object:  StoredProcedure [dbo].[UDSPRBHPRIMBUSTYPE]   
  Script Date:02/12/2009 10:18:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO


ALTER PROCEDURE [dbo].[UDSPRBHPRIMBUSTYPE] WITH EXECUTE AS 'Readuser' AS

DECLARE @SERVERNAME nvarchar(30)
DECLARE @DBASE nvarchar(30)
DECLARE @SQL nvarchar(2000)
SET @SERVERNAME = Convert(nvarchar,
  (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSSERVER'))
SET @DBASE = Convert(nvarchar,
  (SELECT spData FROM dbSpecificData WHERE spLookup = 'CMSDBNAME'))

SET @SQL = 
'SELECT 
    null as Code
    , ''(not specified)'' as Description  
UNION SELECT 
    clnt_cat_code as Code
    , clnt_cat_desc as Description   
FROM '
    + @SERVERNAME + '.' + @DBASE + '.dbo.hbl_clnt_cat  
WHERE 
    inactive = ''N''  
ORDER BY Description'
PRINT @SQL

EXECUTE sp_executeSQL @SQL

@SERVERNAME == 'BHAVMSQL02'

@DBASE      == 'CMSNET_DEV'

執行存儲過程時出現以下錯誤消息...

The server principal "ReadUser" is not able to access the database "CMSNET_DEV" under the current security context.

谷歌搜索錯誤消息后,我進行了以下修復...

  • 從 BHAVMSQL02 -> Databases -> Mattercentre_dev -> Security -> Users 中刪除了用戶 ReadUser
  • 從 BHAVMSQL02 設置 ReadUser -> 安全性 -> 使用以下設置登錄...

    一般的
    登錄名 - readUser
    密碼 - xxxxxxxxxxxx
    確認 - xxxxxxxxxxxx
    默認數據庫 - 主
    默認 lg - 英式英語
    其他一切 - 未設置

    僅服務器角色公共集

    用戶映射 CMSNET_DEV - ReadUser - dbo
    數據庫角色成員資格 - db_owner, public

    Mattercentre_dev - ReadUser - dbo
    數據庫角色成員資格 - db_owner, public

然后我運行了以下腳本...

ALTER DATABASE CMSNET_DEV SET TRUSTWORTHY ON
GO
ALTER DATABASE mattercentre_dev SET TRUSTWORTHY ON
GO

我重新運行存儲過程並再次執行它,但我仍然有相同的錯誤消息。

我在 Stack Overflow 上查過這個問題,建議的解決方案與我自己的類似。

當您的存儲過程包含動態 SQL 時,您不能使用所有權鏈接,即這樣做會破壞所有權鏈。

為了使其工作,您需要使用證書來簽署您的存儲過程。

下面是一篇精彩的文章,其中包含對存儲過程進行簽名的說明。

http://www.sommarskog.se/grantperm.html

更詳細地看這一點,您使用“execute as 子句”的事實應該否定所有權鏈因合並動態 SQL 而被破壞的事實。

考慮到這一點,可能的原因是由於某種原因,登錄名“ReadUser”沒有對相關數據庫的適當讀取訪問權限,但鑒於登錄名是 db_owner 角色的成員,情況不應該如此在兩個數據庫中。 也就是說,如果數據庫角色已從其原始狀態改變,那么這可能不成立。

為了測試問題是否與“ReadUser”登錄無關,我建議創建一個新的 SQL Server 登錄,並將登錄映射到兩個數據庫(通過創建相同名稱的數據庫登錄)並具有適當的讀取訪問權限。 然后修改存儲過程以作為新登錄名執行。

暫無
暫無

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

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