Synonyme in SQL Server sind Datenbankobjekte, die den lokal oder auf dem Remoteserver vorhandenen Datenbankobjekten einen alternativen Namen geben. Außerdem stellen sie eine Abstraktionsschicht bereit, um die Anwendung vor Änderungen am Basisobjekt zu schützen.
In T-SQL-Skripten verwenden wir dreiteilige Namen zum Verweisen auf Datenbankobjekte. Das Format ist:
[Datenbank].[Schema].[Objekt]
Angenommen, wir haben die folgende Datenbankinfrastruktur:
- Datenbankname:[Azuredemodatabase]
- Schema:[SalesLT]
- Objekt(Tabellenname):Produkt
Die SELECT-Anweisung mit dem dreiteiligen Namen lautet wie folgt:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
Ebenso verwendet ein Remote-Server die 4-teilige Namenskonvention. Der zusätzliche Teil ist [Remoteservername]. Daher lautet das Format
[Servername].[Datenbank].[Schema].[Objekt].
Stellen wir uns vor, dass Sie [SalesLT].[Product] umbenennen müssen Tabelle zu [ProductData] .
Auf diese Tabelle wird in mehreren gespeicherten Prozeduren, Funktionen und Ansichten verwiesen. Daher müssen Sie alle derartigen Verweise in Abfragen oder Clientanwendungen ändern, um den neuesten Namen der Tabelle zu verwenden.
Sie können ein Synonym erstellen, das auf das Datenbankobjekt verweist, und es in Ihren SQL-Abfragen verwenden. Sollten sich Änderungen ergeben, müssen Sie nur die Synonymdefinition neu erstellen. Sie müssen keine Objektreferenzen in Abfragen ändern, da wir Synonym verwenden.
In einem anderen Fall erstellen wir ein Synonym, das auf die Tabelle [Azuredemodatabase].[SalesLT].[Product] verweist. Dann löschen wir die Tabelle und erstellen eine Ansicht mit einem ähnlichen Namen. In diesem Fall verweist ein Synonym automatisch auf die Ansicht, da die Objektbindung mit dem Objektnamen erfolgt.
Wenn Sie ein Objekt in eine andere Datenbank verschieben, hilft Ihnen das Synonym, den Änderungsaufwand zu minimieren. Sobald Sie das Synonym neu erstellen, erhalten alle SQL-Abfragen automatisch den neuesten Objektspeicherort.
Sie können auch Synonyme verwenden, um die Namen der Datenbankobjekte zu verbergen. Benutzer können Synonyme zum Abrufen von Ergebnissen abfragen, anstatt die Basistabelle abzufragen.
Sie könnten in SQL Server ein Synonym für die folgenden Objekte definieren:
- Benutzerdefinierte Tabelle
- Gespeicherte Prozedur
- Anzeigen
- Skalare und Inline-Tabellenwertfunktionen
- Lokale und globale temporäre Tabellen
- CLR gespeicherte Prozedur, Funktionen (Tabellenwert, Aggregat, Skalar)
Hinweis:Der Synonymname sollte in einer Datenbank eindeutig sein.
Verwendung von Synonymen in SQL Server
Wir können Synonyme in der T-SQL-Anweisung verwenden, wie Select, Update, Execute, Insert, Delete und Unterabfragen.
Wir können jedoch keine Synonyme in DDL-Anweisungen (Data Definition Language) wie Create und Alter verwenden. Außerdem sind Synonyme nicht für Check-Einschränkungen, berechnete Spalten, Standardausdrücke, Regelausdrücke, schemagebundene Ansichten und Funktionen geeignet.
Erstellen Sie ein Synonym in SQL Server auf dem lokalen Server
Um Synonyme in SQL Server zu erstellen, verwenden wir die CREATE SYNONYM-Anweisung. Die Syntax lautet wie folgt:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
Erstellen wir beispielsweise das Synonym [MyProductCatalog] für [Azuredemodatabase].[SalesLT].[Product] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
Nach der Erstellung können Sie den Tabellennamen wie unten gezeigt durch das Synonym ersetzen. Es verweist intern auf die Basistabelle, auf die wir in der CREATE SYNONYM-Anweisung verwiesen haben.
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
Erstellen Sie ein Synonym in einer Datenbank auf dem Remote-Server
Angenommen, das Objekt existiert auf einem entfernten Server [ABC]. Sie können ein Synonym erstellen, um die Angabe eines vierteiligen Namens in Abfragen zu vermeiden. In der folgenden Abfrage befindet sich das Basisobjekt in [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
Erstellen eines Synonyms mit SQL Server Management Studio
Um Synonyme zu erstellen, können wir die GUI von SQL Server Management Studio verwenden.
- Verbinden Sie sich mit Ihrer SQL-Instanz, erweitern Sie die Datenbank und navigieren Sie zum Ordner "Synonyme".
- Klicken Sie mit der rechten Maustaste darauf und wählen Sie Neues Synonym.
- Geben Sie die erforderlichen Details für den Synonymnamen, das Synonymschema, den Datenbanknamen, das Objektschema, den Objekttyp und den Namen ein.
In unserem Beispiel erstellen wir ein Synonym im Schema [HumanResources], das gleiche wie im Tabellenschema:
Klicken Sie auf Skript um ein äquivalentes T-SQL-Skript wie folgt zu erhalten:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
Synonym für benutzerdefinierte Funktionen
Erstellen Sie zuerst die UDF dbo.TestSynonym mit dem folgenden Skript:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
Erstellen Sie dann ein Synonym dafür mit dem Namen dbo.UDFTest . Sie können die UDF mit dem Synonym aufrufen und die Abfrageergebnisse abrufen:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
Anweisung und Synonym aktualisieren
Angenommen, Sie möchten einen Wert in der SQL-Tabelle aktualisieren. Wenn Sie darauf ein Synonym definiert haben, können Sie es ebenfalls verwenden. Die folgende Update-Anweisung verwendet beispielsweise Synonym [Performancetest] anstelle des SQL-Tabellennamens:
Update performancetest set [Name]='Updated New value' where ID=1
Ein Synonym löschen
Sie können die Anweisung DROP SYNONYM verwenden, um ein bestimmtes Synonym in der Datenbank zu löschen. Die folgende Abfrage löscht [EmpData ] im AdventureWorks2017 Datenbank:
Use AdventureWorks2017
Drop Synonym EmpData
Abrufen der Liste der Datenbanksynonyme in SQL Server
Angenommen, Sie möchten vorhandene Synonyme in einer Datenbank zusammen mit ihrem Basisobjekt kennen. Sie können sys.synonyms abfragen Systemkatalogansicht in der jeweiligen Datenbank:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
In der Abfrageausgabe erhalten Sie die folgenden Informationen:
- Synonymer Name
- Das Basisobjekt (3-teiliger oder 4-teiliger Objektname)
- Objekttyp ( SN =Synonym)
Was ist, wenn wir das Basisobjekt des Synonyms ändern?
Betrachten wir die Auswirkungen der Änderung des Basisobjekts eines Synonyms. Wir haben eine Abfrage, um mehrere Aufgaben auszuführen:
- Erstellen Sie ein Synonym (der Synonymname ist [dbo].[EmpData] für das Basisobjekt [AdventureWorks2017].[DBO].[Emp] )
- Lassen Sie das Basisobjekt (Tabelle) [AdventureWorks2017].[DBO].[Emp] fallen
- Erstellen Sie eine Ansicht mit dem Namen [DBO].[Emp] in der [AdventureWorks2017]-Datenbank.
USE [AdventureWorks2017]
GO
CREATE SYNONYM [dbo].[EmpData] FOR [AdventureWorks2017].[DBO].[Emp]
GO
Drop table [AdventureWorks2017].[DBO].[Emp]
Go
Create view [DBO].[Emp]
as
Select * from dbo.Employee
go
Wie bereits erwähnt, bindet das Synonym ein Objekt anhand seines Namens. Daher sollte es auf die Ansicht statt auf die Tabelle hinweisen. In diesem Fall existiert die Tabelle [dbo].[Emp] nicht.
Wie unten gezeigt, handelt es sich um eine Ansicht in [AdventureWorks2017] Datenbank.
Alternativ können Sie OBJECTPROPERTYEX() verwenden um den Objektbasistyp des Synonyms zu prüfen:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
Hier verweist der Basistyp auf die Datenbankansicht. Im Fall der SQL-Tabelle erhalten Sie U in der Ausgabe.
Wirken sich Synonyme negativ auf die Abfrageleistung aus?
Viele Datenbankprofis ziehen es vor, in SQL Server keine Verwendungssynonyme zu verwenden. Ihr Punkt ist, dass SQL Server einen zusätzlichen Schritt ausführen muss, um die Basistabelle aus dem Synonym aufzulösen. Daher kann es zu einem negativen Effekt kommen.
Lassen Sie uns die Abfrageleistung testen. Wir rufen Datensätze aus dem Tabellennamen und dem Synonym:
abCreate table TestTable
(
ID int,
[Name] varchar(20)
)
Insert into TestTable values (1, 'Temporary Data')
GO 10000
Create synonym performancetest for TestTable
SET STATISTICS IO ON;
Select * from TestTable
Go
Select * from performancetest
Lassen Sie uns zunächst den tatsächlichen Ausführungsplan überprüfen. Beide Abfragebatches haben denselben Ausführungsplan und dieselben Operatorkosten:
Ebenso haben beide Abfragen 41 logische Lesevorgänge und einen Scanzähler zum Abrufen der gewünschten Ausgabe.
SQL Server löst die synonymen Basisobjektnamen in der Bindungsphase der Abfrageausführung auf. Dies geschieht vor der Abfrageoptimierungsphase. Daher sehen Sie einen ähnlichen Ausführungsplan und keine Auswirkungen auf die Leistung. Folglich können Sie Synonyme verwenden, um lange 3- oder 4-teilige Namen für häufig aufgerufene Objekte zu vermeiden. Es wirkt sich nicht auf die Abfrageleistung aus.
Das bedeutet nicht, dass Sie für jedes Objekt wie eine Tabelle, eine gespeicherte Prozedur, Funktionen oder Ansichten ein Synonym erstellen. Sie können sie für Objekte verwenden, auf die am häufigsten zugegriffen wird, um sie in Abfragen schnell zu referenzieren.
Schlussfolgerung
Synonyme in SQL Server können von Vorteil sein. Sie vereinfachen die Datenbankobjektnamen, indem sie 3- oder 4-teilige lange Namen vermeiden. Sie können sie verwenden, um sowohl lokale als auch entfernte Objekte zu referenzieren. Es erzeugt keine Leistungsprobleme. Daher können Sie ihre Verwendung für mehr Flexibilität beim Schreiben von Abfragen untersuchen. Am besten ist es jedoch, Synonyme nur für die häufig verwendeten Objekte in SQL-Skripten zu definieren.