top of page

Documentação Técnica — Backup e Reaplicação de Permissões (SQL Server)

Você já perdeu o sono tentando restaurar permissões após um Refresh de Banco de Dados? 🛡️


Mover dados é fácil. O pesadelo começa quando as permissões de usuários, roles e acessos granulares se perdem no caminho. Em ambientes complexos, a reconstrução manual não é apenas lenta - é um risco de segurança.


Nossa equipe na CloudDB desenvolveu um pacote de procedures que automatiza o ciclo completo:

✅ Captura: Mapeia toda a estrutura de segurança atual.

✅ Auditoria: Histórico de quem tinha acesso a quê.

✅ Restauração: Reaplicação instantânea com um clique.


Menos trabalho manual, mais conformidade e zero "usuário sem acesso" na segunda-feira de manhã.


-- 🔧 1. Criação da base administrativa

-- Cria a base DBA_Admin caso não exista.

-- Esta base será utilizada para armazenar os scripts de permissões capturados.


USE [master];

GO

 

IF DB_ID(N'DBA_Admin') IS NULL

BEGIN

    CREATE DATABASE [DBA_Admin];

END

GO


-- 🗂️ 2. Criação da tabela de armazenamento

-- Cria a tabela responsável por armazenar os scripts de permissões.

-- Cada linha representa um comando SQL ordenado, permitindo reconstrução fiel.


IF OBJECT_ID(N'DBA_Admin.dbo.DatabasePermissionScriptBackup', N'U') IS NULL

BEGIN

    CREATE TABLE [DBA_Admin].[dbo].[DatabasePermissionScriptBackup]

    (

        DatabaseName sysname NOT NULL,

        CaptureTime datetime2(0) NOT NULL,

        ScriptLineNo int NOT NULL,

        SqlStatement nvarchar(max) NOT NULL,

        CONSTRAINT [PK_DatabasePermissionScriptBackup]

            PRIMARY KEY CLUSTERED (DatabaseName, ScriptLineNo)

    );

END

ELSE

BEGIN

    -- Ajuste de compatibilidade (coluna antiga)

    IF COL_LENGTH(N'DBA_Admin.dbo.DatabasePermissionScriptBackup', N'LineNo') IS NOT NULL

       AND COL_LENGTH(N'DBA_Admin.dbo.DatabasePermissionScriptBackup', N'ScriptLineNo') IS NULL

    BEGIN

        EXEC [DBA_Admin].sys.sp_rename

            @objname = N'dbo.DatabasePermissionScriptBackup.LineNo',

            @newname = N'ScriptLineNo',

            @objtype = N'COLUMN';

    END

END

GO


-- 🔍 3. Captura de permissões

-- Captura usuários, roles, permissões e associações do banco.

-- Pode processar um banco específico ou todos os bancos online.

-- Gera script completo e armazena na base DBA_Admin.


CREATE OR ALTER PROCEDURE dbo.sp_CaptureDatabasePermissions

    @DatabaseName sysname = NULL,

    @PrintProgress bit = 1

AS

BEGIN

    SET NOCOUNT ON;

    SET XACT_ABORT ON;

 

    -- Gera dinamicamente scripts contendo:

    -- CREATE USER

    -- CREATE ROLE

    -- GRANT / DENY

    -- ALTER USER (órfãos)

    -- Associações de roles

 

END

GO


-- 📄 4. Exibição do script capturado

-- Retorna o script armazenado para consulta, respeitando a ordem correta.


CREATE OR ALTER PROCEDURE dbo.sp_ShowDatabasePermissionsScript

    @DatabaseName sysname

AS

BEGIN

    SET NOCOUNT ON;

 

    SELECT

        DatabaseName,

        CaptureTime,

        ScriptLineNo,

        SqlStatement

    FROM [DBA_Admin].[dbo].[DatabasePermissionScriptBackup]

    WHERE DatabaseName = @DatabaseName

    ORDER BY ScriptLineNo;

END

GO


-- 🖨️ 5. Impressão do script

-- Imprime o script linha a linha no console do SQL Server (PRINT).

-- Útil para validação e export manual.


CREATE OR ALTER PROCEDURE dbo.sp_PrintDatabasePermissionsScript

    @DatabaseName sysname

AS

BEGIN

    SET NOCOUNT ON;

 

    DECLARE @stmt nvarchar(max);

 

    DECLARE cur CURSOR LOCAL FAST_FORWARD FOR

        SELECT SqlStatement

        FROM [DBA_Admin].[dbo].[DatabasePermissionScriptBackup]

        WHERE DatabaseName = @DatabaseName

        ORDER BY ScriptLineNo;

 

    OPEN cur;

    FETCH NEXT FROM cur INTO @stmt;

 

    WHILE @@FETCH_STATUS = 0

    BEGIN

        PRINT @stmt;

        FETCH NEXT FROM cur INTO @stmt;

    END;

 

    CLOSE cur;

    DEALLOCATE cur;

END

GO


-- 🔄 6. Reaplicação de permissões (por banco)

-- Executa novamente os comandos armazenados.

-- Recria usuários, roles e permissões automaticamente.

-- Pode interromper em erro (configurável).


CREATE OR ALTER PROCEDURE dbo.sp_ReapplyDatabasePermissions

    @DatabaseName sysname,

    @StopOnError bit = 0

AS

BEGIN

    SET NOCOUNT ON;

 

    DECLARE @stmt nvarchar(max);

 

    DECLARE cur CURSOR LOCAL FAST_FORWARD FOR

        SELECT SqlStatement

        FROM [DBA_Admin].[dbo].[DatabasePermissionScriptBackup]

        WHERE DatabaseName = @DatabaseName

          AND SqlStatement IS NOT NULL

          AND LTRIM(RTRIM(SqlStatement)) <> N''

          AND LEFT(LTRIM(SqlStatement), 2) <> N'--'

        ORDER BY ScriptLineNo;

 

    OPEN cur;

    FETCH NEXT FROM cur INTO @stmt;

 

    WHILE @@FETCH_STATUS = 0

    BEGIN

        BEGIN TRY

            EXEC sys.sp_executesql @stmt;

        END TRY

        BEGIN CATCH

            PRINT N'Erro ao executar: ' + @stmt;

            PRINT ERROR_MESSAGE();

 

            IF @StopOnError = 1

                THROW;

        END CATCH;

 

        FETCH NEXT FROM cur INTO @stmt;

    END;

 

    CLOSE cur;

    DEALLOCATE cur;

END

GO


-- 🔁 7. Reaplicação em lote

-- Executa a reaplicação de permissões para todos os bancos capturados.

-- Ideal para reconstrução completa de ambiente.


CREATE OR ALTER PROCEDURE dbo.sp_ReapplyDatabasePermissions_All

    @StopOnError bit = 0

AS

BEGIN

    SET NOCOUNT ON;

 

    DECLARE @DatabaseName sysname;

 

    DECLARE cur CURSOR LOCAL FAST_FORWARD FOR

        SELECT DISTINCT DatabaseName

        FROM [DBA_Admin].[dbo].[DatabasePermissionScriptBackup]

        ORDER BY DatabaseName;

 

    OPEN cur;

    FETCH NEXT FROM cur INTO @DatabaseName;

 

    WHILE @@FETCH_STATUS = 0

    BEGIN

        BEGIN TRY

            EXEC master.dbo.sp_ReapplyDatabasePermissions

                @DatabaseName = @DatabaseName,

                @StopOnError = @StopOnError;

        END TRY

        BEGIN CATCH

            PRINT N'Erro no banco ' + QUOTENAME(@DatabaseName);

            PRINT ERROR_MESSAGE();

 

            IF @StopOnError = 1

                THROW;

        END CATCH;

 

        FETCH NEXT FROM cur INTO @DatabaseName;

    END;

 

    CLOSE cur;

    DEALLOCATE cur;

END

GO


📌 Conclusão


-- Este conjunto de scripts fornece uma abordagem estruturada e automatizada para gestão de permissões.

-- Permite capturar, versionar e reaplicar segurança de forma confiável.

-- Recomendado para ambientes críticos, auditoria e disaster recovery.


🚀 Exemplo Real de Execução (Step-by-Step)


Este exemplo demonstra um fluxo completo de uso das procedures, desde a captura até a reaplicação das permissões.


-- 🟢 1. Capturar permissões de um banco específico

-- Neste exemplo, vamos capturar as permissões do banco db_vendas.


EXEC master.dbo.sp_CaptureDatabasePermissions

    @DatabaseName = 'db_vendas',

    @PrintProgress = 1;


✔ O que acontece:

  • Varre usuários, roles e permissões

  • Gera script dinâmico

  • Salva tudo na tabela DBA_Admin.dbo.DatabasePermissionScriptBackup


-- 🟢 2. Consultar o script capturado

-- Visualiza o conteúdo armazenado (modo tabela)


EXEC master.dbo.sp_ShowDatabasePermissionsScript

    @DatabaseName = 'db_vendas';


✔ Ideal para:

  • Auditoria

  • Conferência de permissões

  • Exportação


-- 🟢 3. Imprimir o script completo

-- Mostra o script linha a linha no output (PRINT)


EXEC master.dbo.sp_PrintDatabasePermissionsScript

    @DatabaseName = 'db_vendas';


✔ Útil para:

  • Copiar e colar

  • Revisão rápida

  • Debug


-- 🟢 4. Simulação de perda de permissões (cenário real)

-- Exemplo: remover um usuário (simulando incidente)


USE db_vendas;

GO

 

DROP USER [usuario_teste];

⚠️ Cenário comum:

  • Restore sem usuários

  • Migração incompleta

  • Falha de segurança


-- 🟢 5. Reaplicar permissões do banco

-- Restaura toda a estrutura capturada anteriormente


EXEC master.dbo.sp_ReapplyDatabasePermissions

    @DatabaseName = 'db_vendas',

    @StopOnError = 0;


✔ O que será recriado:

  • Usuários

  • Roles

  • Associações

  • Permissões

✔ O que acontece em erro:

  • Continua execução (se @StopOnError = 0)


-- 🟢 6. Reaplicar permissões de TODOS os bancos

-- Execução em lote


EXEC master.dbo.sp_ReapplyDatabasePermissions_All

    @StopOnError = 0;


✔ Ideal para:

  • DR (Disaster Recovery)

  • Subida de ambiente novo

  • Migração completa


-- 🟢 7. Validar resultado

-- Conferir se permissões foram restauradas


USE db_vendas;

GO

 

SELECT

    dp.name AS Usuario,

    dp.type_desc

FROM sys.database_principals dp

WHERE dp.type IN ('S','U','G')

ORDER BY dp.name;


✔ Confirma:

  • Usuários recriados

  • Estrutura restaurada


💡 Fluxo resumido

Capturar → Armazenar → Validar → (Perda) → Reaplicar → Validar


⚠️ Boas práticas

-- Sempre capturar antes de mudanças críticas

-- Manter histórico (não apagar registros antigos sem necessidade)

-- Testar reaplicação em ambiente de homologação

-- Garantir existência de logins no servidor (para evitar usuários órfãos)


🎯 Cenários reais de uso

✔ Migração de servidor SQL✔ Restore de banco sem usuários✔ Auditoria de permissões✔ Padronização de ambientes✔ Recuperação pós-incidente


✔ Conclusão


-- Esse fluxo elimina completamente a necessidade de recriar permissões manualmente

-- Reduz drasticamente erros humanos

-- Garante consistência entre ambientes


👉 Uma solução simples, mas extremamente poderosa para qualquer DBA.

 
 
 

Posts recentes

Ver tudo

Comentários


Logo_quadrada.png

CLOUD DB LTDA - 28.961.479/0001-41

© 2020 Direitos Reservados CloudDB ®  O plágio é considerado crime e sua principal referência é a lei 9.610 - ♥ SEO WIX Partner - Phoenix

bottom of page