2015-07-28 95 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