none
SQL Berechtigungen per Skript RRS feed

  • Frage

  • Guten Morgen,

    Ich verwende folgendes Skript um scheduled Berechtigungen auf Datenbanken zu vergeben:

    DECLARE @dbname VARCHAR(50)  
    DECLARE @statement NVARCHAR(max)
    DECLARE db_cursor CURSOR
    LOCAL FAST_FORWARD
    FOR 
    SELECT name
    FROM MASTER.dbo.sysdatabases
    WHERE name NOT IN ('master','model','msdb','tempdb') 
    OPEN db_cursor 
    FETCH NEXT FROM db_cursor INTO @dbname 
    WHILE @@FETCH_STATUS = 0 
    BEGIN 
    SELECT @statement = 'use ['+@dbname +'];'+ 'IF NOT EXISTS (SELECT name
                    FROM [sys].[database_principals]
                    WHERE [type] = ''R'' AND name = N''db_execute'')
    Begin
        CREATE ROLE [db_execute]
     GRANT EXECUTE TO db_execute
        end
    EXEC sp_addrolemember N''db_execute'', [Domain\ServiceUser]'
    exec sp_executesql @statement

    FETCH NEXT FROM db_cursor INTO @dbname 
    END 
    CLOSE db_cursor 
    DEALLOCATE db_cursor

    Eigentlich funktioniert dies ganz gut. Wenn ich dieses Skript allerdings dafür verwende, einem User auf die von mir erstellte Rolle "db_execute" zu berechtigen. Funktioniert dies nicht immer.

    Ich habe bisher noch keinen echten Ansatz um diese Thematik zu umgehen?

    Habt Ihr Tipps?

    Danke & Grüße

    Julian

     

    Montag, 8. Juli 2019 08:13

Alle Antworten

  • Eigentlich funktioniert dies ganz gut. Wenn ich dieses Skript allerdings dafür verwende, einem User auf die von mir erstellte Rolle "db_execute" zu berechtigen. Funktioniert dies nicht immer.

    Ich habe bisher noch keinen echten Ansatz um diese Thematik zu umgehen?

    Habt Ihr Tipps?


    Hallo Julian,

    das ist ungenau "funktioniert nicht immer".

    Aber als Tipp versuche mal sp_MSforeachdb - Ist übersichtlicher als die Cursor-Geschichte:

    set nocount on
    -- @command1 darf maximal 2000 Zeichen beinhalten, wobei das ? in unterschiedlich viele Zeichen geändert wird
    -- (je nach Zeichenlänge der Datenbank), sind mehr Zeichen erforderlich, so kann man @command2 und eventuell @command3 belegen!
    exec sp_MSforeachdb @command1 = '
    if ''?'' in (''master'', ''model'', ''msdb'', ''tempdb'')
    begin
        print ''Nichts tun für Datenbank = ?''
        goto nichts
    end

    use [?]
    IF NOT EXISTS (SELECT name
                    FROM [sys].[database_principals]
                    WHERE [type] = ''R'' AND name = N''db_execute'')
    BEGIN
        CREATE ROLE [db_execute]
        GRANT EXECUTE TO db_execute
    END
    EXEC sp_addrolemember N''db_execute'', [Domain\ServiceUser]

    nichts:'

    Gruß

    Willi

    Montag, 15. Juli 2019 14:00
  • Hi,

    bitte nicht auf MSforeachdb zurückgehen, das ist schon lange abgekündigt.

    Prüf mal bitte, ob das hier Abhilfe schafft:

    'Use '+ Quotename(@Dbname) + '

    Wir hatten immer mal wieder das Problem, dass wir bei dem Befehl mit dem "normalen" Use databasename immer mal wieder zurück auf den Kontext der master Datenbank geflogen sind.

    Mit der Zeile oben wurde es einfacher.

    Kannst ja mal was einbauen, was dir während der Verarbeitung den aktuellen Kontext ausgibt, dann siehst du, ob und wo der Fehler liegt.

    Grüße

    Andreas

    Freitag, 2. August 2019 12:55