gpt4 book ai didi

sql - sys.database_permissions 什么时候会包含 state = 'R' 的行?

转载 作者:行者123 更新时间:2023-12-03 03:05:52 28 4
gpt4 key购买 nike

MSDN documentation for sys.database_permissions 表示状态列可以是“G”、“D”、“R”或“W”。 “R”值有一个“REVOKE”描述,这听起来像是具有该值的行对应于已撤销的权限。然而,据我所知,从the docs for REVOKE ,撤销权限会完全删除它,所以我希望只从 sys.database_permissions 中删除该行。这就是当我测试授予然后撤销许可时发生的情况;之后GRANT该权限显示在该 View 中,并且在 REVOKE 之后它消失了。

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

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

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

最佳答案

对于可以拥有列权限的对象,例如表或 View ,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

关于sql - sys.database_permissions 什么时候会包含 state = 'R' 的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8735631/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com