如何检查 Azure SQL 数据库中特定用户的所有访问权限?

How to check all access rights for specific user in Azure SQL Database?

我有以下关于 schema/privilege 的问题:

  1. 用户可以有多个数据库角色(模式)吗?
  2. db_denydatareader有什么用? (似乎可以在数据库之间有不同的数据库角色,对吧?)
  3. 如果只希望用户读取特定数据库中的数据,db_datareader 和 db_denydatawriter 有什么区别?
  4. 我试图从架构中直接撤销 SELECT(TestUser 使用默认架构 db_datareader),为什么它仍然可以搜索 table?

    REVOKE SELECT ON SCHEMA::db_datareader TO TestUser;
    
  5. 如何仅向用户而不是所有 table 授予 select 和更新少数 table 的权限? (即没有删除和插入权限)

  6. 我在 sys.objects table 中找不到这些系统权限指的是什么?

    select * from sys.database_permissions where major_id <= 0;
    

谢谢。

您似乎认为模式和角色相同,但它们并不相同。角色是安全成员容器,主体可以是角色的成员。模式包含数据库模式绑定对象,它们有助于将数据库对象组合在一起,并由主体拥有。当您创建新用户时,您可以选择他的默认模式,将他添加到特定角色,并授予他模式的所有权。

db_denydatareader 固定数据库角色的成员无法读取数据库中用户 table 的任何数据。

关于db_datareader和db_denydatawriter的区别。 db_datareader 授予对所有 table 的 select 权限,并且它不影响任何插入、更新、删除权限。同时 db_denydatawriter 拒绝对所有 table 的插入、更新和删除权限,它拒绝对任何 table 进行任何更改的权限。即使有人被直接授予插入权限,他们仍然无法插入,因为拒绝否决授予。将用户分配给 db_denydatawriter 角色意味着他们将永远无法对数据库进行任何更改,无论他们拥有什么其他权限。拒绝优先于授权。

关于问题 #4,您可以对模式分组 table,然后拒绝 SELECT 主体或用户对该模式的权限。 db_datareader 是一个固定的数据库角色,它不是一个模式。

DENY SELECT ON schema::[SchemaName] TO [user_name]

同样,您可以授予 SELECT 和更新数据库模式的权限,该模式包含一组 table。

GRANT SELECT, UPDATE on SCHEMA::SchemaName TO [user_name]

您可以找到数据库角色列表 here