Qual è il modo migliore per implementare uno script SQL che conceda autorizzazioni a un ruolo del database su tutte le tabelle utente in un database?

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

Domanda

Qual è il modo migliore per implementare uno script SQL che conceda autorizzazioni di selezione, riferimento, inserimento, aggiornamento ed eliminazione a un ruolo del database su tutte le tabelle utente in un database?

Idealmente, questo script potrebbe essere eseguito più volte, man mano che vengono aggiunte nuove tabelle al database.SQL Server Management Studio genera script per singoli oggetti di database, ma sto cercando più di uno script "spara e dimentica".

È stato utile?

Soluzione

Il dottor Zimmerman è sulla strada giusta in questo caso.Vorrei scrivere una procedura memorizzata che abbia un cursore che scorre attraverso gli oggetti utente utilizzando l'esecuzione immediata per influenzare la concessione.Qualcosa come questo:

 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

Quindi puoi sparare e dimenticare:

EXEC sp_grantastic

Altri suggerimenti

Sono sicuro che esista un modo più semplice, ma potresti scorrere la tabella sysobjects nel database e concedere le autorizzazioni a qualsiasi oggetto della tabella utente esistente.Potresti quindi eseguirlo più volte ogni volta che vengono aggiunte nuove tabelle.

Esiste una procedura MS non documentata chiamata sp_MSforeachtable che potresti utilizzare, che è sicuramente nel 2000 e nel 2005.

Per concedere autorizzazioni selezionate, l'utilizzo sarebbe:

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

Per concedere le altre autorizzazioni, avere una nuova istruzione per ognuna o semplicemente aggiungerle al comando in questo modo:

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

Giocando un po' potrebbe essere possibile trasformare anche il nome del ruolo in un parametro.

Usiamo qualcosa di simile dove lavoro.Ciclo attraverso tutte le tabelle, viste, procedure memorizzate del 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top