Wie kann man das Schema anpassen (MSSQL-Server)?

Wie kann man das Schema anpassen (MSSQL-Server)?

Quelle: siehe auch KB-022/11

Beim Rücksichern oder Anhängen einer Datenbank von einem anderen MSSQL-Server zu einem anderen muss beachtet werden, dass der Benutzer ggfls. gleich heißt, aber ein andere interne GUID hat. Damit besitzt der Benutzer nur Lese-Rechte, keine Schreibrechte. 
Die Informationen und Mappings für MSSQL-Benutzer, Datenbankbenutzer und Datenbankschema stehen in der MSSQL-Datenbank. 

Schematische Darstellung: 
DB2 = rückgesicherte DB1-Datenbank von MSSQL-Server1

Um dies zu ändern, muss das Schema angepasst werden. 

Schritt-für-Schritt-Anleitung

Wenn Schema und Benutzer des alten und neuen MSSQL-Servers gleich heißen

Einige MSSQL-Server-Versionen bietet die Funktion sp_change_users_login. Damit kann die GUID einfach geändert werden. Diese Funktion soll in Zukunft entfernt werden (lt. Microsoft).
Klappt der Befehl nicht (weil nicht mehr verfügbar oder es Fehler gibt), bitte danach vorgehen: “Anleitung für gleiche Benutzer-Namen per alter schema“. 

Befehl:

sp_change_users_login [ @Action = ] 'action' [ , [ @UserNamePattern = ] 'user' ] [ , [ @LoginName = ] 'login' ] [ , [ @Password = ] 'password' ] [;] 

Link zum Nachlesen: sp_change_users_login (Transact-SQL) - SQL Server

 

Anpassung mit sp_change_users_login:

  1. MSSQL-Managementstudio starten und mit einem Admin-Account anmelden. Alternativ kann auch ein anderes ODBC-Tool verwendet werden. Besser und einfacher ist das MSSQL-Managementstudio. 

  2. Eine neue Abfrage erstellen. 

  3. Diesen Befehl eingeben für Anpassung Schema sysadm auf MSSQLServer2 (Datenbank DB2):

    USE DB2; EXEC SP_CHANGE_USERS_LOGIN 'Update_One', 'sysadm', 'sysadm';
  4. Danach beim MSSQL-Server abmelden und neu anmelden. Dann erst ist die Änderung wirksam. 

 

Wenn sp_change_users_login nicht funktioniert oder in der MSSQL-Server-Version nicht verfügbar ist, empfiehlt es sich, das Schema 2x anzupassen. Zuerst auf dbo und dann zurück auf sysadm. Diese Methode hat sich bewährt.

Befehl für die Anpassung:

USE <Datenbank>; ALTER SCHEMA neuesschema TRANSFER [altesschema].[tabelle];

 

Am Beispiel erklärt für die Abbildung "Anpassung Schema sysadm auf MSSQLServer2 (Datenbank DB2)":

  1. MSSQL-Managementstudio starten und mit einem Admin-Account anmelden. Alternativ kann auch ein anderes ODBC-Tool verwendet werden. Besser und einfacher ist das MSSQL-Managementstudio. 

  2. Eine neue Abfrage erstellen. 

  3. Test für 1 Tabelle ausführen, z. Bsp.:

    USE DB2; ALTER SCHEMA dbo TRANSFER [sysadm].[benutzer];
  4. Die Tabellen der DB2 aktualisieren. 
    Wenn die Tabelle dbo.benutzer heißt, hat es funktioniert. Die nachfolgenden Schritte können ausgeführt werden.

  5. Da es mehrere hundert Tabellen gibt, empfiehlt sich für die Anpassung eine Funktion/Schleife auszuführen. Dazu diese Zeilen verwenden (einfach in der Abfrage, siehe Punkt 3. einfügen):

    -- zur gewünschten Datenbank wechseln: USE DB2; -- Aktion ausführen: DECLARE @tabelle nvarchar(100) DECLARE tabellen CURSOR FOR select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'sysadm' OPEN tabellen FETCH NEXT FROM tabellen into @tabelle WHILE @@FETCH_STATUS = 0   BEGIN     Exec('ALTER SCHEMA dbo TRANSFER [sysadm].[' + @tabelle + ']')     FETCH NEXT FROM tabellen     INTO @tabelle END CLOSE tabellen DEALLOCATE tabellen
  6. Diese Zeilen ausführen. 

  7. Kontrolle: Die Tabellen der DB2 aktualisieren. 
    Wenn die Tabellen alle mit "DBO." beginnen, hat es funktioniert. 

  8. Als nächstes das Schema von dbo wieder auf sysadm stellen.  Der MSSQL-Server weist dann automatisch die korrekte GUID zu. Dazu diese Zeilen verwenden (einfach in der Abfrage, siehe Punkt 3. einfügen):

    -- zur gewünschten Datenbank wechseln: USE DB2; -- Aktion ausführen: DECLARE @tabelle nvarchar(100) DECLARE tabellen CURSOR FOR select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'dbo' OPEN tabellen FETCH NEXT FROM tabellen into @tabelle WHILE @@FETCH_STATUS = 0   BEGIN     Exec('ALTER SCHEMA sysadm TRANSFER [dbo].[' + @tabelle + ']')     FETCH NEXT FROM tabellen     INTO @tabelle END CLOSE tabellen DEALLOCATE tabellen
  9. Kontrolle: Die Tabellen der DB2 aktualisieren. 
    Wenn die Tabellen alle mit "sysadm." beginnen, hat es funktioniert. 

 

Wenn das Schema und der Benutzer beim neuen MSSQL-Server unterschiedlich sind

Theoretisch kann man den Befehl "alter user" verwenden. Praktisch sollte bei uns aber immer Benutzer=Schema sein. Die Tabellen müssen zudem angepasst werden. Wir empfehlen daher die Verwendung von “alter schema“. Das Schema muss damit nur 1x angepasst.

Befehl für die Anpassung:

USE <Datenbank>; ALTER SCHEMA neuesschema TRANSFER [altesschema].[tabelle];

 

Am Beispiel erklärt für die Abbildung "Anpassung Schema sysadm zu osecm in Datenbank DB2":

  1. MSSQL-Managementstudio starten und mit einem Admin-Account anmelden. Alternativ kann auch ein anderes ODBC-Tool verwendet werden. Besser und einfacher ist das MSSQL-Managementstudio. 

  2. In der Datenbank Schema und Benutzer osecm anlegen und dem Datenbankbenutzer das Recht DBOwner geben, siehe Wie sollte ein Datenbank-Benutzer angelegt werden (inkl. Schema) - MSSQL-Server? .

  3. Eine neue Abfrage erstellen im MSSQL-Managament-Studio. 

  4. Test für 1 Tabelle ausführen, z. Bsp.:

    USE DB2; ALTER SCHEMA osecm TRANSFER [sysadm].[benutzer];
  5. Die Tabellen der DB2 aktualisieren. 
    Wenn die Tabelle osecm.benutzer heißt, hat es funktioniert. Dann können die folgenden Schritten fortgesetzt werden.

  6. Da es mehrere hundert Tabellen gibt, empfiehlt sich für die Anpassung eine Funktion auszuführen. Dazu diese Zeilen verwenden (einfach in der Abfrage, siehe Punkt 4. einfügen):

    -- zur gewünschten/neuen Datenbank wechseln: USE DB2; -- Aktion ausführen: DECLARE @tabelle nvarchar(100) DECLARE tabellen CURSOR FOR select TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_SCHEMA = 'sysadm' OPEN tabellen FETCH NEXT FROM tabellen into @tabelle WHILE @@FETCH_STATUS = 0   BEGIN     Exec('ALTER SCHEMA osecm TRANSFER [sysadm].[' + @tabelle + ']')     FETCH NEXT FROM tabellen     INTO @tabelle END CLOSE tabellen DEALLOCATE tabellen
  7. Diese Zeilen ausführen. 

  8. Kontrolle: Die Tabellen der DB2 aktualisieren. 
    Wenn die Tabellen alle mit "osecm." beginnen, hat es funktioniert. 

  9. Es ist ratsam, den alten Benutzer sysadm aus der Datenbank und dem Schema zu entfernen. 

 

 

Sollten Fehler auftreten, sollte der Fehlercode geprüft werden.
Denkbar sind: Nicht genug Rechte oder es gibt Views. Tabellen, die in Views eingebunden sind, können nicht geändert werden. Die Views müssen zuerst angepasst werden. Danach können auch die Tabellen angepasst werden.

Verwandte Artikel