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 / 51215
Accepted
nojetlag
nojetlag
Asked: 2013-10-09 07:37:36 +0800 CST2013-10-09 07:37:36 +0800 CST 2013-10-09 07:37:36 +0800 CST

Como fazer script de todas as permissões em um esquema

  • 772

O SQL Management Studio permite criar scripts para todos os objetos db, mas até agora não consegui encontrar uma maneira de criar scripts corretamente em um esquema ou usuário. As permissões de um usuário em um esquema não são incluídas no script que é criado. Eu fiz algo errado ou a MSFT é um pouco desleixada?

ssms sql-server-2012
  • 2 2 respostas
  • 28354 Views

2 respostas

  • Voted
  1. Best Answer
    Kin Shah
    2013-10-09T08:09:38+08:002013-10-09T08:09:38+08:00

    Seu amigo sys.database_permissionsdeve verificar/roteirizar as permissões.

    Abaixo está o script que estou usando ao fazer uma atualização do PROD no servidor DEV ou UAT. Vou fazer o script antes de todas as permissões e após a restauração, apenas executarei o script.

    /*
    Script DB Level Permissions v2.1
    Source: http://www.sqlservercentral.com/scripts/Security/71562/
    */
    
    DECLARE 
        @sql VARCHAR(2048)
        ,@sort INT 
    
    DECLARE tmp CURSOR FOR
    
    
    /*********************************************/
    /*********   DB CONTEXT STATEMENT    *********/
    /*********************************************/
    SELECT '-- [-- DB CONTEXT --] --' AS [-- SQL STATEMENTS --],
            1 AS [-- RESULT ORDER HOLDER --]
    UNION
    SELECT  'USE' + SPACE(1) + QUOTENAME(DB_NAME()) AS [-- SQL STATEMENTS --],
            1 AS [-- RESULT ORDER HOLDER --]
    
    UNION
    
    SELECT '' AS [-- SQL STATEMENTS --],
            2 AS [-- RESULT ORDER HOLDER --]
    
    UNION
    
    /*********************************************/
    /*********     DB USER CREATION      *********/
    /*********************************************/
    
    SELECT '-- [-- DB USERS --] --' AS [-- SQL STATEMENTS --],
            3 AS [-- RESULT ORDER HOLDER --]
    UNION
    SELECT  'IF NOT EXISTS (SELECT [name] FROM sys.database_principals WHERE [name] = ' + SPACE(1) + '''' + [name] + '''' + ') BEGIN CREATE USER ' + SPACE(1) + QUOTENAME([name]) + ' FOR LOGIN ' + QUOTENAME([name]) + ' WITH DEFAULT_SCHEMA = ' + QUOTENAME([default_schema_name]) + SPACE(1) + 'END; ' AS [-- SQL STATEMENTS --],
            4 AS [-- RESULT ORDER HOLDER --]
    FROM    sys.database_principals AS rm
    WHERE [type] IN ('U', 'S', 'G') -- windows users, sql users, windows groups
    
    UNION
    
    /*********************************************/
    /*********    DB ROLE PERMISSIONS    *********/
    /*********************************************/
    SELECT '-- [-- DB ROLES --] --' AS [-- SQL STATEMENTS --],
            5 AS [-- RESULT ORDER HOLDER --]
    UNION
    SELECT  'EXEC sp_addrolemember @rolename ='
        + SPACE(1) + QUOTENAME(USER_NAME(rm.role_principal_id), '''') + ', @membername =' + SPACE(1) + QUOTENAME(USER_NAME(rm.member_principal_id), '''') AS [-- SQL STATEMENTS --],
            6 AS [-- RESULT ORDER HOLDER --]
    FROM    sys.database_role_members AS rm
    WHERE   USER_NAME(rm.member_principal_id) IN (  
                                                    --get user names on the database
                                                    SELECT [name]
                                                    FROM sys.database_principals
                                                    WHERE [principal_id] > 4 -- 0 to 4 are system users/schemas
                                                    and [type] IN ('G', 'S', 'U') -- S = SQL user, U = Windows user, G = Windows group
                                                  )
    --ORDER BY rm.role_principal_id ASC
    
    
    UNION
    
    SELECT '' AS [-- SQL STATEMENTS --],
            7 AS [-- RESULT ORDER HOLDER --]
    
    UNION
    
    /*********************************************/
    /*********  OBJECT LEVEL PERMISSIONS *********/
    /*********************************************/
    SELECT '-- [-- OBJECT LEVEL PERMISSIONS --] --' AS [-- SQL STATEMENTS --],
            8 AS [-- RESULT ORDER HOLDER --]
    UNION
    SELECT  CASE 
                WHEN perm.state <> 'W' THEN perm.state_desc 
                ELSE 'GRANT'
            END
            + SPACE(1) + perm.permission_name + SPACE(1) + 'ON ' + QUOTENAME(SCHEMA_NAME(obj.schema_id)) + '.' + QUOTENAME(obj.name) --select, execute, etc on specific objects
            + CASE
                    WHEN cl.column_id IS NULL THEN SPACE(0)
                    ELSE '(' + QUOTENAME(cl.name) + ')'
              END
            + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USER_NAME(usr.principal_id)) COLLATE database_default
            + CASE 
                    WHEN perm.state <> 'W' THEN SPACE(0)
                    ELSE SPACE(1) + 'WITH GRANT OPTION'
              END
                AS [-- SQL STATEMENTS --],
            9 AS [-- RESULT ORDER HOLDER --]
    FROM    
        sys.database_permissions AS perm
            INNER JOIN
        sys.objects AS obj
                ON perm.major_id = obj.[object_id]
            INNER JOIN
        sys.database_principals AS usr
                ON perm.grantee_principal_id = usr.principal_id
            LEFT JOIN
        sys.columns AS cl
                ON cl.column_id = perm.minor_id AND cl.[object_id] = perm.major_id
    --WHERE usr.name = @OldUser
    --ORDER BY perm.permission_name ASC, perm.state_desc ASC
    
    
    
    UNION
    
    SELECT '' AS [-- SQL STATEMENTS --],
        10 AS [-- RESULT ORDER HOLDER --]
    
    UNION
    
    /*********************************************/
    /*********    DB LEVEL PERMISSIONS   *********/
    /*********************************************/
    SELECT '-- [--DB LEVEL PERMISSIONS --] --' AS [-- SQL STATEMENTS --],
            11 AS [-- RESULT ORDER HOLDER --]
    UNION
    SELECT  CASE 
                WHEN perm.state <> 'W' THEN perm.state_desc --W=Grant With Grant Option
                ELSE 'GRANT'
            END
        + SPACE(1) + perm.permission_name --CONNECT, etc
        + SPACE(1) + 'TO' + SPACE(1) + '[' + USER_NAME(usr.principal_id) + ']' COLLATE database_default --TO <user name>
        + CASE 
                WHEN perm.state <> 'W' THEN SPACE(0) 
                ELSE SPACE(1) + 'WITH GRANT OPTION' 
          END
            AS [-- SQL STATEMENTS --],
            12 AS [-- RESULT ORDER HOLDER --]
    FROM    sys.database_permissions AS perm
        INNER JOIN
        sys.database_principals AS usr
        ON perm.grantee_principal_id = usr.principal_id
    --WHERE usr.name = @OldUser
    
    WHERE   [perm].[major_id] = 0
        AND [usr].[principal_id] > 4 -- 0 to 4 are system users/schemas
        AND [usr].[type] IN ('G', 'S', 'U') -- S = SQL user, U = Windows user, G = Windows group
    
    UNION
    
    SELECT '' AS [-- SQL STATEMENTS --],
            13 AS [-- RESULT ORDER HOLDER --]
    
    UNION 
    
    SELECT '-- [--DB LEVEL SCHEMA PERMISSIONS --] --' AS [-- SQL STATEMENTS --],
            14 AS [-- RESULT ORDER HOLDER --]
    UNION
    SELECT  CASE
                WHEN perm.state <> 'W' THEN perm.state_desc --W=Grant With Grant Option
                ELSE 'GRANT'
                END
                    + SPACE(1) + perm.permission_name --CONNECT, etc
                    + SPACE(1) + 'ON' + SPACE(1) + class_desc + '::' COLLATE database_default --TO <user name>
                    + QUOTENAME(SCHEMA_NAME(major_id))
                    + SPACE(1) + 'TO' + SPACE(1) + QUOTENAME(USER_NAME(grantee_principal_id)) COLLATE database_default
                    + CASE
                        WHEN perm.state <> 'W' THEN SPACE(0)
                        ELSE SPACE(1) + 'WITH GRANT OPTION'
                        END
                AS [-- SQL STATEMENTS --],
            15 AS [-- RESULT ORDER HOLDER --]
    from sys.database_permissions AS perm
        inner join sys.schemas s
            on perm.major_id = s.schema_id
        inner join sys.database_principals dbprin
            on perm.grantee_principal_id = dbprin.principal_id
    WHERE class = 3 --class 3 = schema
    
    
    ORDER BY [-- RESULT ORDER HOLDER --]
    
    
    OPEN tmp
    FETCH NEXT FROM tmp INTO @sql, @sort
    WHILE @@FETCH_STATUS = 0
    BEGIN
            PRINT @sql
            FETCH NEXT FROM tmp INTO @sql, @sort    
    END
    
    CLOSE tmp
    DEALLOCATE tmp 
    
    • 13
  2. Mike Fal
    2013-10-09T08:14:05+08:002013-10-09T08:14:05+08:00

    Você precisará de permissões de script em duas etapas, funções e objetos. Como Kin alude, você pode usar sys.database_permissionspara os objetos, mas desejará usar sys.database_principalse sys.database_role_memberspara a associação de função. O SQL a seguir funcionará apenas para SQL 2012 (versões anteriores devem usar sp_addrolememberpara funções) e deve ser executado no contexto do banco de dados para o qual você está criando permissões de script. Filtre um usuário específico conforme necessário.

    --Add to roles
    SELECT 'ALTER ROLE ' + quotename(dpr.name,'[')  + ' ADD MEMBER ' + quotename(dpu.name,'[')
        FROM sys.database_principals dpr
        JOIN sys.database_role_members drm on (dpr.principal_id = drm.role_principal_id)
        JOIN sys.database_principals dpu on (drm.member_principal_id = dpu.principal_id)
        WHERE dpu.principal_id > 4
    
    --Grant explicit permissions
    SELECT 'GRANT ' + dp.permission_name collate latin1_general_cs_as
        + ' ON ' + s.name + '.' + o.name + ' TO ' + dpr.name 
        FROM sys.database_permissions AS dp
        INNER JOIN sys.objects AS o ON dp.major_id=o.object_id
        INNER JOIN sys.schemas AS s ON o.schema_id = s.schema_id
        INNER JOIN sys.database_principals AS dpr ON dp.grantee_principal_id=dpr.principal_id
        WHERE dpr.name NOT IN ('public','guest')
    

    Dica de chapéu para esta resposta para o segundo script.

    • 8

relate perguntas

  • Por que as sequências Denali devem ter um desempenho melhor do que as colunas de identidade?

  • O SQL Server não deveria oferecer suporte a RANGE?

  • SQL Server Management Studio para um banco de dados remoto

  • Alguém usou o modo sqlcmd na prática? [fechado]

  • O que é SQL Server "Denali"? O que há de novo?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • 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

    Conceder acesso a todas as tabelas para um usuário

    • 5 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
    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
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +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