AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 229511
Accepted
Kimo
Kimo
Asked: 2019-02-13 06:31:10 +0800 CST2019-02-13 06:31:10 +0800 CST 2019-02-13 06:31:10 +0800 CST

如何列出架构的权限?

  • 772

在 SSMS 中,如果您按照路径 [Database] > Security > Schemas 并查看任何架构属性,您将拥有一个“权限”选项卡,其中列出了每个用户对该特定架构拥有的所有权限。

我想做一个查询,它给我与那个选项卡相同的输出。我尝试使用 sys.database_principals、database_permissions 和 sys_objects,但我无法检索链接到模式的权限。

sql-server ssms
  • 3 3 个回答
  • 18973 Views

3 个回答

  • Voted
  1. Best Answer
    Scott Hodgin - Retired
    2019-02-13T06:46:18+08:002019-02-13T06:46:18+08:00

    使用List schema permissions接受的答案,这可能会给你你想要的。

    --demo setup
    CREATE DATABASE listschema
    GO
    
    USE listschema
    GO
    
    CREATE SCHEMA TestSchema
    GO
    
    CREATE USER TestUser WITHOUT LOGIN
    GO
    
    GRANT SELECT
        ON SCHEMA::TestSchema
        TO TestUser
    
    DENY INSERT
        ON SCHEMA::TestSchema
        TO TestUser
    GO
    
    --The actual query
    SELECT state_desc
        ,permission_name
        ,'ON'
        ,class_desc
        ,SCHEMA_NAME(major_id)
        ,'TO'
        ,USER_NAME(grantee_principal_id)
    FROM sys.database_permissions AS PERM
    JOIN sys.database_principals AS Prin
        ON PERM.major_ID = Prin.principal_id
            AND class_desc = 'SCHEMA'
    WHERE major_id = SCHEMA_ID('TestSchema')
        AND grantee_principal_id = user_id('TestUser')
        --AND    permission_name = 'SELECT'
    GO
    
    --cleanup
    USE tempdb
    GO
    
    DROP DATABASE listschema
    

    | state_desc | permission_name | (No column name) | class_desc | (No column name) | (No column name) | (No column name) |
    |------------|-----------------|------------------|------------|------------------|------------------|------------------|
    | DENY       | INSERT          | ON               | SCHEMA     | TestSchema       | TO               | TestUser         |
    | GRANT      | SELECT          | ON               | SCHEMA     | TestSchema       | TO               | TestUser         |
    
    • 6
  2. Randi Vertongen
    2019-02-13T07:28:57+08:002019-02-13T07:28:57+08:00

    此外,如果您在 SSMS 启动时需要确切的查询,它们的可读性不强,并且有几个用于获得 SSMS 中显示的结果。

    在我的测试架构上打开权限时的基本查询:

    exec sp_executesql N'SELECT
    grantee_principal.name AS [Grantee],
    CASE grantee_principal.type WHEN ''R'' THEN 3 WHEN ''A'' THEN 4 ELSE 2 END - CASE ''database'' WHEN  ''database'' THEN 0 ELSE 2 END AS [GranteeType]
    FROM
    sys.schemas AS s
    INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=s.schema_id AND prmssn.minor_id=0 AND prmssn.class=3
    INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id
    WHERE
    (s.name=@_msparam_0)',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'TEST'
    

    为每个授予的权限产生一行

    Grantee GranteeType
    guest   2
    bla 2
    bla 2
    

    (用于授予的查询)

    GRANT EXECUTE ON SCHEMA :: test TO bla;
    GRANT INSERT ON SCHEMA :: test TO bla;
    GRANT INSERT ON SCHEMA :: test TO guest;
    

    第二个查询,针对每个主体,在我的示例中为 bla

    exec sp_executesql N'SELECT
    ascii(prmssn.state) AS [PermissionState],
    null AS [Code],
    grantor_principal.name AS [Grantor],
    prmssn.type AS [SqlCodePP],
    CASE WHEN (prmssn.class=4 or prmssn.class=101 ) THEN CASE (SELECT oc.type FROM sys.database_principals AS oc WHERE oc.principal_id = prmssn.major_id) WHEN ''R'' THEN CASE prmssn.class WHEN 4 THEN 201 ELSE 301 END WHEN ''A'' THEN 202 ELSE CASE prmssn.class WHEN 4 THEN 200 ELSE 101 END END ELSE prmssn.class END AS [HiddenObjectClass]
    FROM
    sys.schemas AS s
    INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=s.schema_id AND prmssn.minor_id=0 AND prmssn.class=3
    INNER JOIN sys.database_principals AS grantor_principal ON grantor_principal.principal_id = prmssn.grantor_principal_id
    INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id
    WHERE
    (grantee_principal.name=@_msparam_0)and((s.name=@_msparam_1))',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000)',@_msparam_0=N'bla',@_msparam_1=N'TEST'
    

    不是真正可读的结果

    PermissionState Code    Grantor SqlCodePP   HiddenObjectClass
    71              NULL     dbo       EX           3
    71              NULL     dbo       IN           3
    

    结合这两个查询,您可以获得更具可读性的内容

    DECLARE @SCHEMA varchar(255) = 'test'
    SELECT DISTINCT
    CASE WHEN prmssn.state = 'D' then 'Deny'  WHEN prmssn.state = 'R' THEN 'REVOKE' WHEN prmssn.state = 'G' THEN 'Grant'   ELSE  ' Grant With Grant Option' end as permissionstate,
    grantor_principal.name AS [Grantor],
    prmssn.permission_name AS [name],
    class_desc,Grantees.grantee
    FROM
    sys.schemas AS s
    INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=s.schema_id AND prmssn.minor_id=0 AND prmssn.class=3
    INNER JOIN sys.database_principals AS grantor_principal ON grantor_principal.principal_id = prmssn.grantor_principal_id
    INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id
    INNER JOIN (SELECT
    grantee_principal.name AS [Grantee]
    FROM
    sys.schemas AS s
    INNER JOIN sys.database_permissions AS prmssn ON prmssn.major_id=s.schema_id AND prmssn.minor_id=0 AND prmssn.class=3
    INNER JOIN sys.database_principals AS grantee_principal ON grantee_principal.principal_id = prmssn.grantee_principal_id
    WHERE
    (s.name= @SCHEMA)) as Grantees
    on Grantees.grantee = grantee_principal.name
    WHERE
    ((s.name=@SCHEMA))
    

    导致:

    permissionstate Grantor name    class_desc  grantee
    Grant            dbo    EXECUTE SCHEMA      bla
    Grant            dbo    INSERT  SCHEMA      bla
    Grant            dbo    INSERT  SCHEMA      guest
    
    • 1
  3. Delta32000
    2022-10-15T05:41:15+08:002022-10-15T05:41:15+08:00

    使用以下命令,我设法得到了更正确的响应:

    SELECT state_desc
        ,permission_name
        ,'ON'
        ,class_desc
        ,SCHEMA_NAME(major_id)
        ,'TO'
        ,USER_NAME(grantee_principal_id)
    FROM sys.database_permissions AS PERM
    JOIN sys.database_principals AS Prin
        ON PERM.grantee_principal_id = Prin.principal_id
            AND PERM.class_desc = 'SCHEMA'
    

    问题是斯科特的回答我认为和之间的联系sys.database_permissions是sys.database_principals不正确的。为什么要加入,major_id因为那代表架构而不是受让人(委托人)。

    但感谢斯科特!你的回答很有帮助!

    • 1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve