Qual é a melhor maneira de implementar um script SQL que conceda permissões a uma função de banco de dados em todas as tabelas de usuários em um banco de dados?

StackOverflow https://stackoverflow.com/questions/44780

Pergunta

Qual é a melhor maneira de implementar um script SQL que conceda permissões de seleção, referência, inserção, atualização e exclusão para uma função de banco de dados em todas as tabelas de usuários em um banco de dados?

Idealmente, esse script poderia ser executado diversas vezes, à medida que novas tabelas fossem adicionadas ao banco de dados.O SQL Server Management Studio gera scripts para objetos de banco de dados individuais, mas estou procurando mais um script do tipo "disparar e esquecer".

Foi útil?

Solução

O Dr. Zimmerman está no caminho certo aqui.Eu gostaria de escrever um procedimento armazenado que tenha um cursor percorrendo objetos de usuário usando execute imediato para afetar a concessão.Algo assim:

 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!] hitting up object %2!', @time, @object_name
        EXECUTE('GRANT '+ @rights +' ON '+ @object_name+' TO '+@role)

    END

    PRINT '[%1!] fin!', @time

    CLOSE c_objects
    DEALLOCATE CURSOR c_objects
END
GO
GRANT ALL ON sp_grantastic TO PUBLIC
GO

Então você pode disparar e esquecer:

EXEC sp_grantastic

Outras dicas

Tenho certeza de que existe uma maneira mais fácil, mas você pode percorrer a tabela sysobjects no banco de dados e conceder permissões a qualquer objeto de tabela de usuário existente.Você poderia então executar isso várias vezes sempre que novas tabelas fossem adicionadas.

Existe um procedimento MS não documentado chamado sp_MSforeachtable que você pode usar, definitivamente em 2000 e 2005.

Para conceder permissões de seleção, o uso seria:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName'

Para conceder as outras permissões, tenha uma nova instrução para cada uma ou apenas adicione-as ao comando assim:

EXECUTE sp_MSforeachtable @command1=' Grant Select on ? to RoleName; Grant Delete on ? to RoleName;'

Com um pouco de brincadeira, também pode ser possível transformar o nome da função em um parâmetro.

Usamos algo semelhante onde trabalho.Percorrendo todas as tabelas, visualizações e procedimentos armazenados do sistema.

CREATE PROCEDURE dbo.SP_GrantFullAccess 
    @username varchar(300)
AS

DECLARE @on varchar(300) 
DECLARE @count int
SET @count = 0

PRINT 'Granting access to user ' + @username + ' on the following objects:'

DECLARE c CURSOR FOR 
SELECT name FROM sysobjects WHERE type IN('U', 'V', 'SP', 'P') ORDER BY name
OPEN c 
FETCH NEXT FROM c INTO @on 
WHILE @@FETCH_STATUS = 0 
BEGIN 
 SET @count = @count + 1
 EXEC('GRANT ALL ON [' + @on + '] TO [' + @username + ']') 
 --PRINT 'GRANT ALL ON [' + @on + '] TO ' + @username
 PRINT @on
 FETCH NEXT FROM c INTO @on 
END 
CLOSE c 
DEALLOCATE c

PRINT 'Granted access to ' + cast(@count as varchar(4)) + ' object(s).'
GO
use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON ? TO Admins, Mgmt",
    @whereand = " and o.name like 'tbl_%'"
GO

use [YourDb]
GO
exec sp_MSforeachtable @command1=
    "GRANT REFERENCES, SELECT ON ? TO Employee, public",
    @whereand = " and o.name like 'tbl_%'"
GO
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top