Wie implementiert man am besten ein SQL-Skript, das einer Datenbankrolle Berechtigungen für alle Benutzertabellen in einer Datenbank erteilt?

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

Frage

Wie implementiert man am besten ein SQL-Skript, das einer Datenbankrolle Berechtigungen zum Auswählen, Referenzieren, Einfügen, Aktualisieren und Löschen für alle Benutzertabellen in einer Datenbank gewährt?

Idealerweise könnte dieses Skript mehrmals ausgeführt werden, wenn neue Tabellen zur Datenbank hinzugefügt werden.SQL Server Management Studio generiert Skripte für einzelne Datenbankobjekte, aber ich suche eher nach einem „Fire-and-Forget“-Skript.

War es hilfreich?

Lösung

Hier ist Dr. Zimmerman auf dem richtigen Weg.Ich würde versuchen, eine gespeicherte Prozedur zu schreiben, bei der ein Cursor Benutzerobjekte durchläuft und dabei „Sofort ausführen“ verwendet, um die Gewährung zu beeinflussen.Etwas wie das:

 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

Dann können Sie feuern und vergessen:

EXEC sp_grantastic

Andere Tipps

Ich bin mir sicher, dass es einen einfacheren Weg gibt, aber Sie könnten die sysobjects-Tabelle in der Datenbank durchlaufen und allen vorhandenen Benutzertabellenobjekten Berechtigungen erteilen.Sie können dies dann mehrmals ausführen, wenn neue Tabellen hinzugefügt werden.

Es gibt eine undokumentierte MS-Prozedur namens sp_MSforeachtable, die Sie verwenden können und die definitiv aus den Jahren 2000 und 2005 stammt.

Um ausgewählte Berechtigungen zu erteilen, wäre die Verwendung wie folgt:

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

Um die anderen Berechtigungen zu erteilen, müssen Sie entweder für jede eine neue Anweisung erstellen oder sie einfach wie folgt zum Befehl hinzufügen:

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

Mit ein wenig Herumspielen könnte es möglich sein, den Rollennamen auch in einen Parameter umzuwandeln.

Wo ich arbeite, verwenden wir etwas Ähnliches.Durchlaufen aller Tabellen, Ansichten und gespeicherten Prozeduren 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
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top