MSDN documentation for sys.database_permissions
表示状态列可以是“G”,“D”,“R”或“W”。 'R'值有一个'REVOKE'的描述,这使得它听起来像一行,这个值对应于一个被撤销的权限。但是,正如我在the docs for REVOKE
中所知,撤消权限会完全删除它,因此我希望只删除sys.database_permissions
中的行。当我测试授予然后撤销许可时,就会发生这种情况;在GRANT
之后,该权限会显示在该视图中,REVOKE
之后它将消失。
我的问题:在什么情况下这个视图会包含状态设置为'R'的行?我问这个是因为我不确定在代码中检查这个视图时是否需要处理'R'行。
我可以想到可能发生这种情况的一些可能情况,但没有找到任何确认:
REVOKE
命令时,答案 0 :(得分:3)
对于可以具有列权限的对象,例如表或视图,
DENY
或GRANT
对象权限的存在需要REVOKE
才能保留列权限。下面是一个在SQL Server 2008上测试的工作示例,它演示了R
中状态为sys.database_permissions
的记录何时可以存在。如果GRANT
和REVOKE
语句的顺序相反,则状态为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)
答案 2 :(得分:0)
是的,sys.database_permissions表可能包含状态为R的行.R表示撤销&它将出现在表格的州列中。
我们还可以有D(拒绝),G(格兰特),W(格兰特和格兰特选项)以及R.
此状态列的数据类型为char(1)
请参阅以下链接以便更好地理解。