5

MSDN 文档sys.database_permissions说状态列可以是“G”、“D”、“R”或“W” 。“R”值具有“REVOKE”的描述,这听起来像是具有该值的行将对应于撤销的权限。但是,据我所知REVOKEsys.database_permissions. 这就是当我测试授予然后撤销权限时发生的情况;在GRANT权限出现在该视图中之后,在REVOKE它消失之后。

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

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

  • 如果您授予了一些总括权限,然后撤销了总括权限所暗示的更细化的权限,则可能会出现“R”行(细化权限将显示为“R”)。到目前为止,我还没有找到任何这样的权限。
  • 当 SQL 正在处理命令时,“R”行可能会非常短暂地出现REVOKE,然后整行就会消失。我没有观察到这一点,但大概只有一个很小的时间窗口才会出现。
4

3 回答 3

5

对于可以具有列权限的对象,例如表或视图,存在DENYGRANT对象权限需要REVOKE保留列权限。下面是一个在 SQL Server 2008 上测试的工作示例,它演示了何时R可以在sys.database_permissions. 如果GRANTandREVOKE语句的顺序颠倒了,那么有状态的记录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
于 2015-05-20T19:35:06.127 回答
1

正如Jack Richins 在 Twitter 上的回答(感谢@Remus Rusanu 的转发):

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

我对此进行了测试,他是正确的。

于 2012-08-20T15:13:15.023 回答
0

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

我们还可以有 D(Deny)、G(Grant)、W(Grant with Grant option) 和 R。

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

请参阅以下链接以获得更好的理解。

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

于 2012-04-19T10:14:49.800 回答