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”行。
我可以想到一些可能发生这种情况的潜在场景,但还没有找到任何确认:
REVOKE
命令时可能会非常短暂地出现,然后整行消失。我没有观察到这一点,但大概只有一个很小的时间窗口才会出现。对于可以具有列权限的对象,例如表或视图,存在DENY
或GRANT
对象权限需要REVOKE
保留列权限。下面是一个在 SQL Server 2008 上测试的工作示例,它演示了何时R
可以在sys.database_permissions
. 如果GRANT
andREVOKE
语句的顺序颠倒了,那么带有状态的记录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)