-- ======================================================================
-- Skript: Generiert ALTER SERVER ROLE ... ADD MEMBER Anweisungen
-- Zweck: Migration von Serverrollen-Mitgliedschaften auf einen neuen Server
-- Verwendung:
-- 1. Auf dem Quell-Server ausführen.
-- 2. Die Ausgabe (Spalte 'command') auf dem Ziel-Server ausführen.
-- 3. Dokumentation der ausgeführten Befehle.
-- Hinweis: Die Logins müssen auf dem Ziel-Server bereits existieren.
-- ======================================================================
SET NOCOUNT ON;
SELECT
R.name AS server_role,
P.name AS role_member,
-- Moderner Befehl mit QUOTENAME für sichere Behandlung von Sonderzeichen
'ALTER SERVER ROLE ' + QUOTENAME(R.name) + ' ADD MEMBER ' + QUOTENAME(P.name) + ';' AS command
FROM sys.server_role_members RM
INNER JOIN sys.server_principals P
ON RM.member_principal_id = P.principal_id
INNER JOIN (
SELECT principal_id, name
FROM sys.server_principals
WHERE type_desc = 'SERVER_ROLE'
) R ON RM.role_principal_id = R.principal_id
WHERE
-- 1. Temporäre Logins ausschließen (beginnen mit '#')
P.name NOT LIKE '#%'
-- 2. Windows-Systemkonten (NT AUTHORITY, NT SERVICE) ausschließen
AND P.name NOT LIKE 'NT %'
-- 3. Verhindern, dass Rollen Mitglied anderer Rollen sind (selten, aber möglich)
AND P.type_desc <> 'SERVER_ROLE'
-- 4. Eingebaute 'sa' ausschließen (existiert immer)
AND P.name NOT IN ('sa')
-- 5. (Optional) System-Logins wie ##MS_...## ausschließen – aktivieren bei Bedarf
-- AND P.name NOT LIKE '##%##'
ORDER BY R.name, P.name;