sql >> Database teknologi >  >> RDS >> Sqlserver

Introduktion til synonymer i SQL Server

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.


  1. Hvorfor vender pg_restore tilbage med succes, men gendannes faktisk ikke min database?

  2. Sådan afkortes tekst med en Ellipsis i MariaDB

  3. identitet fra sql indsæt via jdbctemplate

  4. Sådan overføres et array til en lagret SQL Server-procedure