O Guia Definitivo para Conceder Permissões em Todas as Tabelas de Usuário no SQL Server
Gerenciar permissões no SQL Server é crucial para manter a integridade e segurança do seu banco de dados. Um cenário comum surge quando você precisa conceder permissões em todas as tabelas de usuário a um papel de banco de dados específico de forma transparente. Se você se sente frustrado ao escrever vários scripts ou ajustando permissões manualmente toda vez que adiciona novas tabelas, você não está sozinho. Neste guia, exploraremos como criar um script SQL versátil que permite conceder permissões de SELECT
, REFERENCES
, INSERT
, UPDATE
e DELETE
a um papel de banco de dados em todas as tabelas de usuário com facilidade.
O Desafio: Conceder Permissões de Forma Eficiente
O SQL Server Management Studio (SSMS) geralmente gera scripts para objetos de banco de dados individuais, o que pode ser tedioso ao lidar com várias tabelas. Além disso, modificar permissões para tabelas recém-adicionadas pode rapidamente se tornar uma tarefa que consome tempo. O que você precisa é de um script robusto de “fire-and-forget” que possa ser executado para aplicar permissões em todas as tabelas de usuário sem a necessidade de revisitar o script a cada vez.
A Solução: Um Procedimento Armazenado para Concessão de Permissões
Para automatizar eficazmente a concessão de permissões, podemos criar um procedimento armazenado que utiliza um cursor para percorrer todos os objetos de usuário e conceder as permissões desejadas. Vamos dividir o processo em etapas gerenciáveis:
Etapa 1: Criar o Procedimento Armazenado
Comece definindo seu procedimento armazenado. Use o seguinte código SQL como modelo:
IF EXISTS (
SELECT 1 FROM sysobjects
WHERE name = 'sp_grantastic'
AND type = 'P'
)
DROP PROCEDURE sp_grantastic
GO
CREATE PROCEDURE sp_grantastic
AS
DECLARE
@object_name VARCHAR(30),
@time VARCHAR(8),
@rights VARCHAR(20),
@role VARCHAR(20)
DECLARE c_objects CURSOR FOR
SELECT name
FROM sysobjects
WHERE type IN ('P', 'U', 'V')
FOR READ ONLY
BEGIN
SELECT @rights = 'ALL',
@role = 'PUBLIC'
OPEN c_objects
WHILE (1=1)
BEGIN
FETCH c_objects INTO @object_name
IF @@SQLSTATUS <> 0 BREAK
SELECT @time = CONVERT(VARCHAR, GetDate(), 108)
PRINT '[%1!] atingindo o objeto %2!', @time, @object_name
EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role)
END
PRINT '[%1!] fim!', @time
CLOSE c_objects
DEALLOCATE CURSOR c_objects
END
GO
GRANT ALL ON sp_grantastic TO PUBLIC
GO
Etapa 2: Compreender os Componentes
- Declaração do Cursor: O cursor
c_objects
é configurado para percorrer todas as tabelas de usuário (U
), views (V
) e procedimentos armazenados (P
). - Execução das Concessões: Para cada objeto recuperado pelo cursor, o sistema executa um comando
GRANT
, aplicando os direitos definidos ao papel especificado. - Informações de Saída: O procedimento imprime logs indicando o horário da execução e quais objetos receberam permissões.
Etapa 3: Executar o Procedimento
Uma vez que o procedimento armazenado é criado, você pode executá-lo com um comando simples:
EXEC sp_grantastic
Com apenas esse comando, seu papel de banco de dados receberá as permissões necessárias em todas as tabelas de usuário de forma transparente.
Conclusão
Você acabou de aprender a criar um poderoso script SQL que concede permissões a um papel de banco de dados em todas as tabelas de usuário de maneira simples. Essa abordagem não apenas otimiza seu fluxo de trabalho, mas também garante que suas permissões estejam sempre atualizadas sem intervenção manual. Da próxima vez que você adicionar uma nova tabela ao seu banco de dados, basta executar o procedimento armazenado novamente, e você estará pronto para seguir em frente.
Feliz codificação!