Benutzer mit den meisten Antworten
Script für den Export einer DB Role erstellen

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üßeChristian
- Bearbeitet Christian Kiefer Mittwoch, 14. September 2011 09:20
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 SecurablesIch 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- Als Antwort vorgeschlagen Falk Krahl Donnerstag, 15. September 2011 11:00
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 21. September 2011 14:47
-
- Als Antwort vorgeschlagen Falk Krahl Donnerstag, 15. September 2011 11:00
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 21. September 2011 14:47
-
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- Als Antwort vorgeschlagen Falk Krahl Donnerstag, 15. September 2011 11:00
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 21. September 2011 14:47
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 SecurablesIch 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- Als Antwort vorgeschlagen Falk Krahl Donnerstag, 15. September 2011 11:00
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 21. September 2011 14:47
-
- Als Antwort vorgeschlagen Falk Krahl Donnerstag, 15. September 2011 11:00
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 21. September 2011 14:47
-
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
HenryChristoph Muthmann [MVP] wrote:
etwas schöneres habe ich bisher auch nicht gefunden.
-
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- Als Antwort vorgeschlagen Falk Krahl Donnerstag, 15. September 2011 11:00
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 21. September 2011 14:47
-
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 esnicht 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