2015-07-28 121 views
0

我在SQL Server 2008 R2上。覆蓋較低級別的DENY權限

我不得不在數據庫級別上爲用戶進行DENY VIEW DEFINITION。

DENY VIEW DEFINITION TO myUser1; 

這很有效,因爲myUser1在查詢INFORMATION_SCHEMA視圖時不再取回任何行。

問題是,myUser1仍然需要查詢INFORMATION_SCHEMA.PARAMETERS視圖,但不能訪問任何其他INFORMATION SCHEMA視圖。

如果我發出REVOKE,或者授予INFORMATION_SCHEMA.PARAMETERS上的VIEW DEFINITION權限,用戶仍然無法取回任何行。 我知道有更高級別的DENY,它會覆蓋我在低級別上做的任何事情。 不過,有沒有辦法解決? 在數據庫級別具有DENY VIEW DEFINITION,並且僅爲一個特定的INFORMATION_SCHEMA視圖覆蓋它?

謝謝 喬

+2

無論您將它放在較低級別還是更高級別(我知道的唯一例外是用戶屬於sysadmin角色,在這種情況下拒絕都不會被考慮),DENY總是會覆蓋GRANT, 。所以我認爲最好的選擇是隻將DENY放在那些有問題的INFORMATION_SCHEMA視圖上。 –

回答

1

我不能重寫否認,但我可以覆蓋不足的撫卹金。

CREATE PROCEDURE dbo.getDefinitions 
AS 
BEGIN 
    SELECT * FROM [INFORMATION_SCHEMA].[PARAMETERS] AS [p]; 
END 
GO 
CREATE CERTIFICATE signingCert 
ENCRYPTION BY PASSWORD = '[email protected]!' 
    WITH SUBJECT = 'Code signing certificate', 
    EXPIRY_DATE = '2099-01-01' 
GO 
ADD SIGNATURE TO dbo.[getDefinitions] 
    BY CERTIFICATE signingCert 
    WITH PASSWORD = '[email protected]!' 
CREATE USER viewDefinitionUser FROM CERTIFICATE signingCert 
GRANT VIEW DEFINITION TO viewDefinitionUser 
GRANT EXECUTE ON dbo.[getDefinitions] TO [foobar]; 
go 

其中'foobar'是您希望能夠查看參數信息的實際用戶。基本上,您在過程的上下文中獲得提升權限(無論授予與簽名證書相關聯的用戶的權限)。

+0

有趣的解決方法,但有點太多了。如果缺少授予,那麼爲什麼授予不起作用? – Avithohol

+0

我不明白你的問題。如果您願意爲該用戶授予視圖定義,則整個場景將消失。關鍵是你可以通過這種方式控制*他們如何查看information_schema模式中的表。 –

+0

Ben,標誌着它的靈魂。謝謝 – Avithohol