2008-09-04 1 views
2

Was ist die beste Methode zum Implementieren eines SQL-Skripts, das einer Datenbankrolle in allen Benutzertabellen einer Datenbank Berechtigungen zum Auswählen, Verweisen, Einfügen, Aktualisieren und Löschen erteilt?Was ist die beste Methode zum Implementieren eines SQL-Skripts, das einer Datenbankrolle für alle Benutzertabellen in einer Datenbank Berechtigungen erteilt?

Im Idealfall könnte dieses Skript mehrmals ausgeführt werden, wenn neue Tabellen zur Datenbank hinzugefügt wurden. SQL Server Management Studio generiert Skripts für einzelne Datenbankobjekte, aber ich suche nach einem "Fire-and-Forget" -Skript.

+1

Ist dies nicht das, was die Rollen db_datareader und db_datawriter sind? Oder gab es sie nicht, als diese Frage gestellt wurde? –

Antwort

1

Dr Zimmerman ist hier auf dem richtigen Weg. Ich würde schauen, um eine gespeicherte Prozedur zu schreiben, die einen Cursor hat, der Benutzerobjekte durchschleicht, indem ich execute sofort benutze, um das Gewähren zu beeinflussen. Etwas wie folgt aus:

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 '[email protected]) 

    END 

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

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

Dann können Sie feuern und vergessen:

EXEC sp_grantastic 
2

Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber Sie könnten die sysobjects-Tabelle in der Datenbank durchlaufen und Berechtigungen für alle existierenden Benutzer-Tabellenobjekte erteilen. Sie könnten das dann mehrmals ausführen, wenn neue Tabellen hinzugefügt werden.

0

Wir verwenden etwas ähnliches, wo ich arbeite. Durch alle Tabellen, Ansichten, Stored Procedures des Systems.

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 
2

Es gibt eine undokumentierte MS-Verfahren sp_MSforeachtable genannt, die Sie verwenden könnte, die auf jeden Fall im Jahr 2000 und 2005.

wählen Sie Berechtigungen zu erteilen die Verwendung wäre:

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

den anderen zu gewähren Berechtigungen haben entweder eine neue Anweisung für jede oder fügen sie einfach dem Befehl wie folgt hinzu:

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

Mit etwas herumspielen könnte es auch möglich sein, den Rollennamen in einen Parameter umzuwandeln.

0
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 
Verwandte Themen