Von Zeit zu Zeit kann es vorkommen, dass ein Datenbankobjekt aus verschiedenen Gründen umbenannt werden muss. Wenn das passiert, können die nativen Funktionen zum Umbenennen von SQL Server-Datenbankobjekten sehr nützlich sein. Es gibt jedoch große Unterschiede zwischen dem einfachen Umbenennen von SQL Server-Datenbankobjekten im SQL Server Management Studio und dem sicheren Umbenennen mit ApexSQL Refactor.
In diesem Artikel werden die Unterschiede zwischen dem Umbenennen von Datenbankobjekten mit SSMS und der Funktion „Sicheres Umbenennen“ von ApexSQL Refactor erläutert.
Im folgenden Beispiel erstellen wir die neue Datenbank NewDB und zwei Tabellen Users und Address. Die Tabelle Adresse wird Fremdreferenzen auf die Tabelle Benutzer haben:
CREATE DATABASE NewDB;CREATE TABLE Users (UserID INT PRIMARY KEY IDENTITY(1, 1),FirstName VARCHAR(20),Lastname VARCHAR(50),Address VARCHAR(250))GOCREATE TABLE Address (ID INT NOT NULL IDENTITY(1, 1),City VARCHAR(120),PostalCode INT,UserAddressID INT FOREIGN KEY REFERENCES Users(UserID))GO
Erstellen Sie dann zwei Stored Procedures sp_GetUserAddress und sp_GetUserCity:
CREATE PROCEDURE sp_GetUserAddressASBEGINSELECT FirstName,Lastname,AddressFROM UsersENDGOCREATE PROCEDURE sp_GetUserCityASBEGINSELECT Users.FirstName,Users.Lastname,Address.CityFROM UsersINNER JOIN Address ON Users.UserID = Address.UserAddressIDENDGO
Und zum Schluss erstellen Sie die Ansicht v_Address01 und den Trigger trgAfterInsert:
CREATE VIEW .ASSELECT ID,City,PostalCode,UserAddressIDFROM dbo.AddressINNER JOIN Users ON Users.UserID = Address.UserAddressIDGOCREATE TRIGGER trgAfterInsert ON .FOR INSERTASPRINT 'Data entered successfully'GO
Datenbankobjekte mit SSMS umbenennen
Um die Abhängigkeiten für die Tabelle Benutzer zu sehen, markieren Sie diese im Objekt-Explorer und wählen im Kontextmenü den Befehl Abhängigkeiten anzeigen.
Dieser Befehl öffnet das Fenster Objektabhängigkeiten für die ausgewählte Tabelle, in diesem Fall für die Tabelle Benutzer. In der Liste im Fenster Objektabhängigkeiten stehen alle Objekte aus der Datenbank NewDB, die von der Tabelle Users abhängen:
Ein Teil der referenzierten Objekte hat schemagebundene Abhängigkeiten zur Tabelle Users (Trigger trgAfterInsert und Tabelle Address), ein anderer Teil hat nicht-schemagebundene Abhängigkeiten (Stored Procedures sp_GetUserCity und sp_GetUserAddress sowie View v_Address01).
Datenbankobjekte, die schema-gebundene Abhängigkeiten zur Tabelle Users haben, übernehmen automatisch alle vorgenommenen Änderungen. Nach der Umbenennung der Tabelle „Users“ treten keine abhängigkeitsbezogenen Fehler auf.
Die Namensänderung der Tabelle „Users“ führt jedoch dazu, dass nicht schemagebundene Abhängigkeitsobjekte ungültig werden. Um diese Datenbankobjekte nach der Umbenennung der Tabelle Users zu verwenden, muss ihr Code manuell geändert werden.
Um das in einem Beispiel zu sehen, markieren Sie die Tabelle Users im Objekt-Explorer-Fenster und klicken Sie im Kontextmenü auf den Befehl Umbenennen:
Geben Sie einen neuen Namen für die Tabelle Users ein, z. B. NewUsers und aktualisieren Sie die Datenbank NewDB. In der Tabellenliste wird sie in NewUsers umbenannt:
Nach der Eingabe des neuen Namens für die Tabelle und dem Aktualisieren der Datenbank wird die Liste der referenzierten Objekte geändert. Prüfen Sie, ob sich die Abhängigkeiten für die umbenannte Tabelle NewUsers geändert haben. Wählen Sie erneut die Tabelle NewUsers aus und klicken Sie auf den Befehl Abhängigkeiten anzeigen:
Die Liste der referenzierten Objekte hat sich nun geändert.
Die gespeicherte Prozedur sp_GetUserAddress befindet sich nicht mehr in der Liste der referenzierten Objekte. Die Ausführung dieser Stored Procedure wird mit folgender Meldung beendet:
Msg 208, Level 16, State 1, Procedure sp_GetUserAddress, Line 4
Ungültiger Objektname ‚Users‘.
Die gespeicherte Prozedur sp_GetUserCity und die Ansicht v_Address01 stehen dagegen noch in der Liste, aber wenn diese verwendet werden, werden Fehler ausgelöst:
Msg 208, Level 16, State 1, Procedure sp_GetUserCity, Line 8
Ungültiger Objektname ‚dbo.Users‘.
Msg 208, Level 16, State 1, Procedure v_Address01, Line 8
Ungültiger Objektname ‚dbo.Users‘.
Msg 4413, Level 16, State 1, Line 1
Could not use view or function ‚v_Address01‘ because of binding errors.
Dies beweist, dass das Umbenennen einer Tabelle mit SSMS nicht automatisch alle Datenbankobjekte aktualisiert, die sich auf sie beziehen. Der Code der Objekte, die nicht schemagebundene Abhängigkeiten zu der Tabelle Benutzer haben, muss manuell aktualisiert werden. Solange nicht alle Skripte der Objekte geöffnet sind und jeder Verweis auf die Tabelle Users in NewUsers geändert wurde, können Sie diese Objekte nicht fehlerfrei weiter verwenden.
Umbenennen von Datenbankobjekten mit ApexSQL Refactor
ApexSQL Refactor, ein Add-In für Visual Studio und SSMS, bietet über 200 Formatierungsoptionen und 15 Code-Refactoren für die Formatierung und das Refactoring von SQL-Code und Datenbankobjekten.
Eine der SQL-Code-Refactoring-Funktionen von ApexSQL Refactor ist Safe Rename. Diese Funktion ermöglicht das Umbenennen von Objekten des SQL Servers, ohne die Abhängigkeiten zur Datenbank zu zerstören. Datenbankobjekte, die mit diesem ApexSQL Refactor-Feature umbenannt werden können, sind: Tabellen, Views, Prozeduren, Funktionen, Tabellen-/View-Spalten und Prozedur-/Funktionsparameter.
Um zu sehen, wie die Funktion „Sicheres Umbenennen“ funktioniert, markieren Sie die Tabelle „Benutzer“ im Objekt-Explorer und klicken Sie im Kontextmenü auf den Befehl „Sicheres Umbenennen“:
Oder wählen Sie die gleiche Option im Hauptmenü von ApexSQL Refactor:
Das Fenster Sicheres Umbenennen erscheint:
In den Feldern Neues Schema und Neuer Name stehen das Schema und der Name der ausgewählten Tabelle.
Die Benachrichtigung – gelbes blinkendes Dreieck – zeigt an, dass die Tabelle mit diesem Schema und Namen bereits existiert.
In diesem Fenster kann das Tabellenschema geändert werden, indem eines der vorhandenen Datenbankschemata aus der Dropdown-Liste ausgewählt wird. Beim Umbenennen einer Tabelle mit SSMS gehört dies nicht zu den Optionen. Deshalb wird für dieses Beispiel das Tabellenschema nicht geändert.
In das Feld Neuer Name wird der neue Tabellenname eingetragen. Wichtig zu wissen ist, dass es keine Einschränkungen für die verwendeten Zeichen gibt. Für dieses Beispiel wird der neue Name für die Tabelle Users NewUsers lauten.
Klicken Sie auf die Schaltfläche Vorschau, die sich in der unteren linken Ecke des Fensters Sicher umbenennen befindet.
Unter der Registerkarte Generiertes Skript befindet sich das T-SQL-Refactoring-Skript, das nach der Ausführung die Tabelle Users umbenennen wird. In diesem Fenster kann das Skript nicht geändert, sondern nur überprüft werden:
Alle Warnungen, die sich auf die Umbenennung der Tabelle beziehen, finden Sie unter der Registerkarte Warnungen. Für dieses Beispiel gibt es keine Warnungen:
Um alle Aktionen zu überprüfen, die für die Umbenennung der Tabelle Benutzer ausgeführt werden, klicken Sie auf die Registerkarte Reihenfolge. Alle Aktionen sind so geordnet, dass ihre Ausführung verhindert, dass Abhängigkeiten zwischen den Objekten gebrochen werden:
Unter dem Reiter Abhängigkeiten befindet sich eine Liste aller referenzierten Datenbankobjekte zur Tabelle Users. ApexSQL Refactor macht keinen Unterschied zwischen schemagebundenen und nicht-schemagebundenen Abhängigkeitsobjekten, da alle referenzierten Objekte unabhängig vom Typ der Abhängigkeiten zur Tabelle Users aktualisiert werden:
Für die Umbenennung der Tabelle Users klicken Sie einfach auf die Schaltfläche Skript erstellen. Das erzeugte Skript wird im SSMS-Abfrage-Editor-Fenster geöffnet:
Im Abfrage-Editor kann das Skript modifiziert werden oder es kann so wie es ist ausgeführt werden. Nach der Ausführung erscheint die folgende Meldung:
Vorsicht: Das Ändern eines beliebigen Teils eines Objektnamens kann Skripte und gespeicherte Prozeduren zerstören.
Nach dem Aktualisieren der Datenbank NewDB in der Tabellenliste wird statt der Tabelle Users die Tabelle NewUsers angezeigt, genauso wie nach dem Umbenennen der Tabelle mit SSMS, aber mit einem großen Unterschied – keines der referenzierten Objekte ist ungültig.
Zur Kontrolle, wenn die Abhängigkeiten für die umbenannte Tabelle NewUsers mit der SSMS-Funktion Abhängigkeiten anzeigen überprüft werden, erscheint diese Liste:
Diese Liste ist genau die gleiche wie die erste, bevor der Name der Tabelle mit ApexSQL Refactor geändert wurde.
Mit der Funktion „Sicheres Umbenennen“ von ApexSQL Refactor ist es einfacher, die Tabelle umzubenennen, und zwar ohne zusätzlichen Aufwand für die Änderung aller referenzierten Objekte. Außerdem können in einem Fenster alle Dinge, die das Umbenennen betreffen, überprüft werden (Warnungen, Sequenzen, Abhängigkeiten).
Dieses Beispiel zeigte, wie eine Tabelle umbenannt wird, aber die gleichen Schritte sind für das Umbenennen aller SQL Server-Datenbankobjekte (Tabellen-/View-Spalten, Funktions-/Prozedur-Parameter, Views, Funktionen, Prozeduren).