sys.database_permissions何时包含state ='R'的行?

时间:2012-01-04 23:33:03

标签: sql sql-server permissions database-permissions

MSDN documentation for sys.database_permissions表示状态列可以是“G”,“D”,“R”或“W”。 'R'值有一个'REVOKE'的描述,这使得它听起来像一行,这个值对应于一个被撤销的权限。但是,正如我在the docs for REVOKE中所知,撤消权限会完全删除它,因此我希望只删除sys.database_permissions中的行。当我测试授予然后撤销许可时,就会发生这种情况;在GRANT之后,该权限会显示在该视图中,REVOKE之后它将消失。

我的问题:在什么情况下这个视图会包含状态设置为'R'的行?我问这个是因为我不确定在代码中检查这个视图时是否需要处理'R'行。

我可以想到可能发生这种情况的一些可能情况,但没有找到任何确认:

    如果您授予了一些一揽子权限,然后撤消了一揽子权限暗示的更细化的权限(粒度权限将显示为“R”),则可能会出现
  • 'R'行。到目前为止,我还没有找到任何此类权限。
  • 当SQL处理REVOKE命令时,
  • 'R'行可能会非常短暂地显示,然后整行消失。我没有观察到这一点,但可能只有一个非常小的时间窗口出现。

3 个答案:

答案 0 :(得分:3)

对于可以具有列权限的对象,例如表或视图, DENYGRANT对象权限的存在需要REVOKE才能保留列权限。下面是一个在SQL Server 2008上测试的工作示例,它演示了R中状态为sys.database_permissions的记录何时可以存在。如果GRANTREVOKE语句的顺序相反,则状态为R的记录不会保留。

https://gist.github.com/mches/d2282946fbe7f50a708b

CREATE USER RevokeTestUser WITHOUT LOGIN;

REVOKE CONNECT TO RevokeTestUser AS dbo;

CREATE TABLE dbo.RevokeTest (
     col int NOT NULL
);

GRANT SELECT ON dbo.RevokeTest TO RevokeTestUser AS dbo;
REVOKE SELECT ON dbo.RevokeTest (col) TO RevokeTestUser AS dbo;

SELECT *
FROM sys.database_permissions
WHERE grantee_principal_id = DATABASE_PRINCIPAL_ID(N'RevokeTestUser');

DROP USER RevokeTestUser;

DROP TABLE dbo.RevokeTest;

这些是SELECT声明的结果:

class   class_desc         major_id     minor_id    grantee_principal_id   grantor_principal_id   type   permission_name   state   state_desc
1       OBJECT_OR_COLUMN   1081939822   0           31                     1                      SL     SELECT            G       GRANT
1       OBJECT_OR_COLUMN   1081939822   1           31                     1                      SL     SELECT            R       REVOKE

答案 1 :(得分:1)

Jack Richins on Twitter回答(感谢@Remus Rusanu转发):

  

我相信它会发生与列或视图权限相矛盾的列级别权限。

我测试了这个,他是对的。

答案 2 :(得分:0)

是的,sys.database_permissions表可能包含状态为R的行.R表示撤销&它将出现在表格的州列中。

我们还可以有D(拒绝),G(格兰特),W(格兰特和格兰特选项)以及R.

此状态列的数据类型为char(1)

请参阅以下链接以便更好地理解。

http://msdn.microsoft.com/en-us/library/ms188367.aspx