-- ======================================================================
-- 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;