none
Script für den Export einer DB Role erstellen RRS feed

  • Frage

  • Hallo allerseits,

    ich habe eine DB Role erstellt und möchte das zugehörige Script einschließlicher der Permissions und Securables exporiteren, so dass ich die Role auf einer anderen DB einspielen kann.

    Mit welchem Tool, bzw wie ist das Möglich?

    Das SQL-Server Management Studio erstellt mir leider nur das Create Script für die Rolle jedoch ohne Permissions und Securables


    Grüße

    Christian


    Mittwoch, 14. September 2011 08:37

Antworten

  • Hallo Christian

    Christian Kiefer wrote:

    ich habe eine DB Role erstellt und möchte das zugehörige Script
    einschließlicher der Permissions und Securables exporiteren, so dass ich
    die Role auf einer anderen DB einspielen kann.

    Mit welchem Tool, bzw wie ist das Möglich?

    Das SQL-Server Management Studio erstellt mir leider nur das Create Script für die Rolle jedoch ohne Permissions und Securables

    Ich habe mir mal mit einer Abfrage geholfen:

    DECLARE @Rolle NVARCHAR(255)
    SET @Rolle = 'Name der zu skriptenden Rolle'
    
    SELECT D.State_Desc + ' '
                + D.Permission_Name + ' ON ['
                + O.Name COLLATE DATABASE_DEFAULT + '] TO ['
                + P.Name + ']'
    FROM sys.database_permissions AS D INNER JOIN
            sys.Database_Principals P ON D.grantee_Principal_ID = P.Principal_ID
    JOIN sys.objects AS O
    ON D.major_id = O.object_id
    WHERE P.Name = @Rolle

    Vermutlich gibt's schönere und modernere Wege, als Systemtabellen auszulesen. Für mich hat's gereicht, um die Berechtigungen einer Rolle zu "scripten" ;-)

    Gruss
    Henry

    Mittwoch, 14. September 2011 10:14
  • Hallo Henry,
    etwas schöneres habe ich bisher auch nicht gefunden.
     
    Hier ist noch ein anderer Thread zu dem Thema:
     
    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu
     
     
    Mittwoch, 14. September 2011 10:32
  • Hallo Henry,

    dem kannst Du geschickt entgehen, indem man überhaupt keine JOINS mehr verwendet. Alle Informationen können über explizite Funktionen (wie Du es ja bereits mit OBJECT_NAME() machst ermittelt werden.

    SELECT Class,
           class_desc,
           OBJECT_NAME(major_id) AS ObjectName,
           user_name(grantee_principal_id) AS Grantee,
           user_name(grantor_principal_id) AS Grantor,
           tpye, permission_name,
           state_desc
    FROM sys.database_permissions
    WHERE grantee_principal_id = user_id('public')
    


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    Mittwoch, 14. September 2011 11:06

Alle Antworten

  • Hallo Christian

    Christian Kiefer wrote:

    ich habe eine DB Role erstellt und möchte das zugehörige Script
    einschließlicher der Permissions und Securables exporiteren, so dass ich
    die Role auf einer anderen DB einspielen kann.

    Mit welchem Tool, bzw wie ist das Möglich?

    Das SQL-Server Management Studio erstellt mir leider nur das Create Script für die Rolle jedoch ohne Permissions und Securables

    Ich habe mir mal mit einer Abfrage geholfen:

    DECLARE @Rolle NVARCHAR(255)
    SET @Rolle = 'Name der zu skriptenden Rolle'
    
    SELECT D.State_Desc + ' '
                + D.Permission_Name + ' ON ['
                + O.Name COLLATE DATABASE_DEFAULT + '] TO ['
                + P.Name + ']'
    FROM sys.database_permissions AS D INNER JOIN
            sys.Database_Principals P ON D.grantee_Principal_ID = P.Principal_ID
    JOIN sys.objects AS O
    ON D.major_id = O.object_id
    WHERE P.Name = @Rolle

    Vermutlich gibt's schönere und modernere Wege, als Systemtabellen auszulesen. Für mich hat's gereicht, um die Berechtigungen einer Rolle zu "scripten" ;-)

    Gruss
    Henry

    Mittwoch, 14. September 2011 10:14
  • Hallo Henry,
    etwas schöneres habe ich bisher auch nicht gefunden.
     
    Hier ist noch ein anderer Thread zu dem Thema:
     
    Einen schönen Tag noch,
    Christoph
    --
    Microsoft SQL Server MVP
    www.insidesql.org/blogs/cmu
     
     
    Mittwoch, 14. September 2011 10:32
  • Dann bin ich aber beruhigt ;-)

    Das einzige, was mich damals gestört hat, war, dass ich da einen Collation Konflict bekam und habe das dann COLLATE DATABASE_DEFAULT gelöst.

    Mit Der Funktion OBJECT_NAME() wird das dann eben moderner umschifft.

    Gruss
    Henry

    Christoph Muthmann [MVP] wrote:

    etwas schöneres habe ich bisher auch nicht gefunden.

    Mittwoch, 14. September 2011 10:39
  • Hallo Henry,

    dem kannst Du geschickt entgehen, indem man überhaupt keine JOINS mehr verwendet. Alle Informationen können über explizite Funktionen (wie Du es ja bereits mit OBJECT_NAME() machst ermittelt werden.

    SELECT Class,
           class_desc,
           OBJECT_NAME(major_id) AS ObjectName,
           user_name(grantee_principal_id) AS Grantee,
           user_name(grantor_principal_id) AS Grantor,
           tpye, permission_name,
           state_desc
    FROM sys.database_permissions
    WHERE grantee_principal_id = user_id('public')
    


    Uwe Ricken

    MCITP Database Administrator 2005
    MCITP Database Administrator 2008
    MCITP Microsoft SQL Server 2008, Database Development

    db Berater GmbH
    http://www-db-berater.de
    Mittwoch, 14. September 2011 11:06
  • Hallo Uwe

    Uwe Ricken wrote:

    dem kannst Du geschickt entgehen, indem man überhaupt keine JOINS mehr
    verwendet. Alle Informationen können über explizite Funktionen (wie Du es

    nicht ich, Christoph war der mordernere ;-)

    ja bereits mit OBJECT_NAME() machst ermittelt werden.

    ..

          user_name(grantee_principal_id) AS Grantee,

    Und intern gehen diese dann mit einem Select genau auf die gleiche Tabelle zu. Da frage ich mich allerdings, ob ein Join nicht doch besser ist, es sei denn, es gibt noch andere Unterschiede, wie z.B. eben beim Object_Name(), welcher dann die Collation korrekt zurückgibt, so dass diese auch als NVARCHAR() weiterverarbeitet werden kann.

    Gruss
    Henry

    Donnerstag, 15. September 2011 06:44
  • Hallo Christian Kiefer,

    Ich gehe davon aus, dass die Antworten Dir weitergeholfen haben.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert

    Mittwoch, 21. September 2011 14:46
    Moderator