2009-02-12 40 views
1

系統規格

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 

上的SQL Server 2005中稱爲BHAVMSQL02,我有兩個數據庫Mattercentre_devCMSNET_DEV。該Mattercentre_dev有建立在CMSNET_DEV從表列表中的存儲過程。該存儲過程看起來 像這樣...服務器主體「XYuser」不能訪問數據庫「YDB」當前安全環境下

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. 

google搜索錯誤消息後,我進行了如下修正...

  • 刪除用戶ReadUser從 BHAVMSQL02 - >數據庫 - > Mattercentre_dev - >安全 - >用戶
  • 從BHAVMSQL02設置ReadUser - > 安全性 - 具有以下 設置>登錄...

    一般
    登錄名 - readUser
    密碼 - XXXXXXXXXXXX
    確認 - XXXXXXXXXXXX
    默認數據庫 - master
    默認lg - 英國英語
    其他的東西 - 取消設置

    個服務器角色 僅公共設置

    用戶映射 CMSNET_DEV - ReadUser - DBO
    數據庫角色成員 - 的db_owner,公共

    Mattercentre_dev - ReadUser - DBO
    數據庫角色成員 - 的db_owner,公共

然後我運行以下腳本...

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

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

我已經在堆棧溢出看這個問題,並建議的解決方案 類似於我自己。

回答

1

當你的存儲過程包含動態SQL,即這樣做,你不能使用所有權鏈打破了所有權鏈。

爲了這個工作,你需要使用證書籤署您的存儲過程。

下面是一篇精彩的文章,其中包含有關簽署存儲過程的說明。

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

進一步詳細見到這種情景,事實上,你正在使用的「EXECUTE AS條款」應該否定的事實所有權鏈斷爲集成動態SQL的結果。

考慮到這一點,可能的原因在於,由於某種原因,登錄「ReadUser」沒有適當的對有問題的數據庫的讀取訪問權限,但不應該這樣,因爲登錄是成員兩個數據庫中的db_owner角色。也就是說,如果數據庫角色已經從原始狀態改變了,那麼這可能不適用。

爲了測試問題不是孤立於「ReadUser」登錄,我建議創建一個新的SQL Server登錄,並將登錄映射到兩個數據庫(通過創建具有相同名稱的數據庫登錄) 。然後修改存儲過程以作爲新登錄執行。

相關問題