Permissões de GRANT para todas as tabelas, exibições, procedimentos no SQL Server 2000

8

Eu queria saber se havia uma maneira bastante eficiente de usar o T-SQL com sintaxe do SQL Server 2000 para GRANT SELECT, INSERT, UPDATE, DELETE, em todas as tabelas e visualizações de um banco de dados específico, excluindo 2 ou 3 dos mais de 100 objetos. Eu também gostaria de poder conceder privilégios EXEC em todos os procedimentos armazenados.

Atualmente, estou usando o código abaixo para alterá-los um por um. Fazer isso em cerca de 100 tabelas e 100 visualizações está demorando muito e demorará ainda mais na GUI (a menos que eu esteja fazendo isso errado também).

use [DATABASE_NAME]
GO
GRANT DELETE ON [dbo].[table_name]TO [user_name]
GO
use [DATABASE_NAME]
GO
GRANT INSERT ON [dbo].[table_name]TO [user_name]
GO
use [DATABASE_NAME]
GO
GRANT SELECT ON [dbo].[table_name]TO [user_name]
GO
use [DATABASE_NAME]
GO
GRANT UPDATE ON [dbo].[table_name]TO [user_name]
GO

Como posso usar o T-SQL para percorrer TODAS as tabelas e exibições de usuários para conceder certos privilégios particulares e excluir alguns objetos?

Geoff Dawdy
fonte

Respostas:

8

Ugh, 2000.

Supondo que todos os objetos pertencem a dbovocê, você pode gerar um script, por exemplo:

SELECT N'GRANT INSERT, UPDATE, DELETE, SELECT ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type IN (N'U', N'V');

SELECT N'GRANT EXECUTE ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'P';

Agora você pode copiar e colar a saída, caso deseje excluir qualquer entrada ou validar. Se você deseja apenas executar cegamente, pode fazer isso, mas ele depende do conteúdo de qualquer conjunto de comandos individual <4K:

DECLARE @sql NVARCHAR(4000) = N'';

SELECT @sql = @sql + N'GRANT INSERT, UPDATE, DELETE, SELECT ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'U';

EXEC sp_executesql @sql;

SET @sql = N'';

SELECT @sql = @sql + N'GRANT INSERT, UPDATE, DELETE, SELECT ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'V';

EXEC sp_executesql @sql;

SET @sql = N'';

SELECT @sql = @sql + N'GRANT EXECUTE ON dbo.' + QUOTENAME(name)
  + N' TO [user];'
FROM sysobjects WHERE type = N'P';

EXEC sp_executesql @sql;
Aaron Bertrand
fonte