AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 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

Como listar permissões em um esquema?

  • 772

No SSMS, se você seguir o caminho [Banco de dados] > Segurança > Esquemas e visualizar qualquer propriedade do esquema, você terá uma guia "permissões" que lista todas as permissões que cada usuário possui nesse esquema específico.

Eu gostaria de fazer uma consulta que me dê a mesma saída que essa guia. Tentei usar sys.database_principals, database_permissions e sys_objects, mas não consigo recuperar as permissões vinculadas aos esquemas.

sql-server ssms
  • 3 3 respostas
  • 18973 Views

3 respostas

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

    Usando a resposta aceita de List schema permissions , isso provavelmente forneceria o que você deseja.

    --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

    Além disso, se você precisar das consultas exatas à medida que o SSMS as inicia, elas não são tão legíveis e várias são usadas para obter o resultado mostrado no SSMS.

    A consulta base ao abrir as permissões no meu esquema de teste:

    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'
    

    Resultando em uma linha para cada permissão concedida

    Grantee GranteeType
    guest   2
    bla 2
    bla 2
    

    (Consultas usadas para conceder)

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

    A segunda consulta, para cada principal, bla no meu exemplo

    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'
    

    Resultado não muito legível

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

    Combinando as duas consultas, você pode obter algo um pouco mais legível

    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))
    

    Resultando em:

    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

    Com o seguinte comando consegui obter uma resposta mais correta:

    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'
    

    A coisa é que a resposta de Scott eu acho que a ligação entre sys.database_permissionse sys.database_principalsestá incorreta. Por que aderir , uma major_idvez que representa o esquema e não o donatário (principal).

    Mas obrigado Scott !! sua resposta ajuda muito!

    • 1

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve