Synonymer i SQL Server er databaseobjekter, der giver et alternativt navn til databaseobjekterne, der findes lokalt eller på den eksterne server. De giver også et abstraktionslag for at beskytte applikationen mod eventuelle ændringer i basisobjektet.
I T-SQL-scripts bruger vi 3-delte navne til at referere til databaseobjekter. Formatet er:
[Database].[Skema].[Objekt]
Antag for eksempel, at vi har følgende databaseinfrastruktur:
- Databasenavn:[Azuredemodatabase]
- Skema:[SalesLT]
- Objekt(tabelnavn):Produkt
SELECT-sætningen med det 3-delte navn er som nedenfor:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
På samme måde bruger en fjernserver den 4-delte navngivningskonvention. Den ekstra del er [navn på fjernserver]. Derfor vil formatet være
[Servernavn].[Database].[Skema].[Objekt].
Lad os forestille os, at du skal omdøbe [SalesLT].[Produkt] tabel til [ProductData] .
Der henvises til denne tabel i flere lagrede procedurer, funktioner og visninger. Derfor skal du ændre alle sådanne referencer i forespørgsler eller klientapplikationer for at bruge det seneste navn på tabellen.
Du kan oprette et synonym, der refererer til databaseobjektet og bruge det i dine SQL-forespørgsler. Skulle der ske ændringer, behøver du kun at genskabe synonymdefinitionen. Du behøver ikke at ændre nogen objektreferencer i forespørgsler, fordi vi bruger Synonym.
I et andet tilfælde opretter vi et synonym, der peger på tabellen [Azuredemodatabase].[SalesLT].[Produkt]. Derefter dropper vi tabellen og opretter en visning med et lignende navn. I dette tilfælde vil et synonym automatisk henvise til visningen, fordi objektbinding sker med objektnavnet.
Hvis du flytter et objekt til en anden database, hjælper synonymet dig med at minimere indsatsen, når du foretager ændringer. Når du har genskabt synonymet, får alle SQL-forespørgsler automatisk den seneste objektplacering.
Du kan også bruge synonymer til at skjule databaseobjekternes navne. Brugere kan forespørge Synonymer for at hente resultater i stedet for at forespørge i basistabellen.
Du kan definere et synonym i SQL Server for følgende objekter:
- Brugerdefineret tabel
- Gemt procedure
- Vis
- Skalære og indlejrede tabelværdierede funktioner
- Lokale og globale midlertidige tabeller
- CLR-lagret procedure , funktioner (tabelværdi, aggregeret, skalar)
Bemærk:Synonymnavnet skal være unikt i en database.
Hvor skal man bruge synonymer i SQL Server
Vi kan bruge synonymer i T-SQL-sætningen, såsom Vælg, Opdater, Udfør, Indsæt, Slet og underforespørgsler.
Vi kan dog ikke bruge synonymer i datadefinitionssprog (DDL)-udsagn som Create og Alter. Synonymer er heller ikke egnede til Check-begrænsninger, beregnede kolonner, standardudtryk, regeludtryk, skemabundne visninger og funktioner.
Opret et synonym i SQL Server i lokal server
For at oprette synonymer i SQL Server bruger vi CREATE SYNONYM-sætningen. Syntaksen er følgende:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
Lad os for eksempel oprette synonymet [MyProductCatalog] for [Azuredemodatabase].[SalesLT].[Produkt] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
Når det er oprettet, kan du erstatte tabelnavnet med synonymet som vist nedenfor. Den refererer internt til basistabellen, som vi refererede til i CREATE SYNONYM-sætningen.
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
Opret et synonym i en database på fjernserveren
Antag, at objektet findes på en fjernserver [ABC]. Du kan oprette et synonym for at undgå at angive et 4-delt navn i forespørgsler. I nedenstående forespørgsel er basisobjektet i [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
Oprettelse af et synonym med SQL Server Management Studio
For at oprette synonymer kan vi bruge GUI'et i SQL Server Management Studio.
- Opret forbindelse til din SQL-instans, udvid databasen, og naviger til mappen Synonymer.
- Højreklik på det, og vælg Nyt synonym.
- Indtast de nødvendige detaljer for synonymnavn, synonymskema, databasenavn, objektskema, objekttype og navn.
I vores eksempel opretter vi et synonym i skemaet [HumanResources], det samme som i tabelskemaet:
Klik på Script for at få et tilsvarende T-SQL-script som nedenfor:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
Synonym for brugerdefinerede funktioner
Først skal du oprette UDF dbo.TestSynonym ved hjælp af nedenstående script:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
Opret derefter et synonym for det med navnet dbo.UDFTest . Du kan ringe til UDF ved hjælp af synonymet og hente forespørgselsresultaterne:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
Opdater erklæring og synonym
Antag, at du vil opdatere en værdi i SQL-tabellen. Hvis du har defineret et synonym på det, kan du også bruge det. For eksempel bruger nedenstående opdateringserklæring Synonym [Perofmancetest] i stedet for SQL-tabelnavnet:
Update performancetest set [Name]='Updated New value' where ID=1
Slet et synonym
Du kan bruge DROP SYNONYM-sætningen til at slette et specifikt synonym i databasen. Nedenstående forespørgsel dropper [EmpData ] i AdventureWorks2017 database:
Use AdventureWorks2017
Drop Synonym EmpData
Hent listen over databasesynonymer i SQL Server
Antag, at du vil kende eksisterende synonymer i en database sammen med deres basisobjekt. Du kan forespørge på sys.synonyms systemkatalogvisning i den respektive database:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
I forespørgselsoutputtet får du følgende information:
- Synonymnavn
- Basisobjektet (3-delt eller 4-delt objektnavn)
- Objekttype (SN =Synonym)
Hvad hvis vi ændrer synonymets basisobjekt?
Lad os overveje virkningen af at ændre basisobjektet for et synonym. Vi har en forespørgsel om at udføre flere opgaver:
- Opret et synonym (synonymnavnet er [dbo].[EmpData] for basisobjektet [AdventureWorks2017].[DBO].[Emp] )
- Slip basisobjektet (tabel) [AdventureWorks2017].[DBO].[Emp]
- Opret en visning med navnet [DBO].[Emp] i [AdventureWorks2017]-databasen.
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
Som tidligere nævnt binder synonymet et objekt ved hjælp af dets navn. Det bør således pege ud til udsigten i stedet for tabellen. I dette tilfælde eksisterer tabellen [dbo].[Emp] ikke.
Som vist nedenfor er det en visning i [AdventureWorks2017] database.
Alternativt kan du bruge OBJECTPROPERTYEX() for at kontrollere synonymets objektbasetype:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
Her refererer basetypen til databasevisningen. I tilfældet med SQL-tabellen får du U i outputtet.
Påvirker synonymer forespørgselsydelsen negativt?
Mange databaseprofessionelle foretrækker ikke at bruge synonymer i SQL Server. Deres pointe er, at SQL Server skal udføre et ekstra trin i løsningen af basistabellen fra synonymet. Det kan derfor have en negativ effekt.
Lad os teste forespørgselsydeevnen. Vi henter poster fra tabelnavnet og synonymet:
Create 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
Lad os først tjekke den faktiske udførelsesplan. Begge forespørgselsbatcher har samme udførelsesplan og operatøromkostninger:
På samme måde har begge forespørgsler 41 logiske læsninger og én scanning for at hente det ønskede output.
SQL Server løser synonymbaseobjektnavnene i bindingsfasen af forespørgselsudførelsen. Dette sker før forespørgselsoptimeringsfasen. Derfor ser du en lignende eksekveringsplan og ingen præstationspåvirkning. Derfor kan du bruge synonymer til at undgå lange 3-delte eller 4-delte navne for ofte tilgåede objekter. Det påvirker ikke forespørgselsydelsen.
Det betyder ikke, at du opretter et synonym for hvert objekt, såsom en tabel, lagret procedure, funktioner, visninger. Du kan bruge dem til de mest brugte objekter til hurtig reference til dem i forespørgsler.
Konklusion
Synonymer i SQL Server kan være gavnlige. De forenkler databaseobjektnavnene ved at undgå 3-delte eller 4-delte lange navne. Du kan bruge dem til at referere til både lokale og eksterne objekter. Det giver ingen præstationsproblemer. Derfor kan du udforske at bruge dem til fleksibilitet i at skrive forespørgsler. Det bedste af det hele er dog kun at definere synonymer for de ofte brugte objekter i SQL-scripts.