Quelle est la meilleure façon de mettre en œuvre un script SQL qui va accorder des autorisations à un rôle de base de données sur toutes les tables de l'utilisateur dans une base de données?

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

Question

Quelle est la meilleure façon de mettre en œuvre un script SQL qui vont permettre de sélectionner, de références, d'insérer, mettre à jour et supprimer des autorisations à un rôle de base de données sur toutes les tables de l'utilisateur dans une base de données?

Idéalement, ce script peut être exécuté plusieurs fois, que de nouvelles tables ont été ajoutées à la base de données.SQL Server Management Studio génère des scripts individuels pour les objets de base de données, mais je suis à la recherche pour plus de "fire-and-forget" script.

Était-ce utile?

La solution

Le Dr Zimmerman est sur la bonne voie.Je serais à la recherche d'écrire une procédure stockée qui a un curseur en boucle à travers l'utilisation d'objets à l'aide d'exécution immédiate d'affecter la subvention.Quelque chose comme ceci:

 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

Vous pouvez ensuite le feu et oublier:

EXEC sp_grantastic

Autres conseils

Je suis sûr qu'il ya un moyen plus facile, mais vous pouvez faire une boucle par la sysobjects table dans la base de données et d'accorder des autorisations à un utilisateur quelconque de la table des objets qui existent.Vous pouvez ensuite exécuter qu'à plusieurs reprises chaque fois que de nouvelles sont ajoutées.

Il y a un sans-papiers MS procédure appelée sp_MSforeachtable que vous pouvez utiliser qui est certainement en 2000 et 2005.

Pour accorder des autorisations select l'utilisation serait:

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

Pour accorder les autres autorisations ont une nouvelle déclaration pour chacun ou tout simplement les ajouter à la commande comme ceci:

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

Avec un peu de jouer autour, il pourrait être possible de tourner la nom de rôle dans un paramètre.

Nous utilisons quelque chose de similaire où je travaille.Une boucle dans toutes les Tables, Vues, Procédures Stockées du système.

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top