sys.database_permissions 何时会包含状态 = 'R' 的行?

Cha*_*lie 5 sql sql-server permissions database-permissions

所述用于MSDN文档sys.database_permissions说,状态栏可以是“G”,“d”,“R”,或“W”。'R' 值有一个 'REVOKE' 的描述,这听起来像是具有该值的行对应于已撤销的权限。然而,尽我可以告诉的文档的REVOKE,撤销权限完全删除它,所以我希望这只是从删除行sys.database_permissions。这就是我测试授予然后撤销许可时发生的情况;在GRANT该权限显示在该视图中之后,以及在REVOKE它消失之后。

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

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

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

Mar*_*ney 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;
Run Code Online (Sandbox Code Playgroud)

这些是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
Run Code Online (Sandbox Code Playgroud)


Cha*_*lie 1

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

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

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