sql >> Databasteknik >  >> RDS >> Sqlserver

Introduktion till synonymer i SQL Server

En synonym i SQL Server är databasobjekt som ger ett alternativt namn till databasobjekten som finns lokalt eller på fjärrservern. De tillhandahåller också ett abstraktionslager för att skydda applikationen från alla ändringar i basobjektet.

I T-SQL-skript använder vi 3-delade namn för att referera till databasobjekt. Formatet är:

[Databas].[Schema].[Objekt]

Anta till exempel att vi har följande databasinfrastruktur:

  • Databasnamn:[Azuredemodatabase]
  • Schema:[SalesLT]
  • Objekt(tabellnamn):Produkt

SELECT-satsen med det tredelade namnet är enligt nedan:

SELECT  [ProductID]
      ,[Name]
      ,[ProductNumber]
      ,[Color]
      ,[StandardCost]
      ,[ListPrice]
      ,[Size]
      ,[Weight]
      ,[ProductCategoryID]
      ,[ProductModelID]
      ,[SellStartDate]
      ,[SellEndDate]
      ,[DiscontinuedDate]
      ,[ThumbNailPhoto]
      ,[ThumbnailPhotoFileName]
      ,[rowguid]
      ,[ModifiedDate]
  FROM [Azuredemodatabase].[SalesLT].[Product]

På liknande sätt använder en fjärrserver den 4-delade namnkonventionen. Den extra delen är [fjärrservernamn]. Därför kommer formatet att vara

[Servernamn].[Databas].[Schema].[Objekt].

Låt oss föreställa oss att du behöver byta namn på [SalesLT].[Produkt] tabell till [ProductData] .

Denna tabell hänvisas till i flera lagrade procedurer, funktioner och vyer. Därför måste du ändra alla sådana referenser i frågor eller klientapplikationer för att använda det senaste namnet på tabellen.

Du kan skapa en synonym som refererar till databasobjektet och använda den i dina SQL-frågor. Om några ändringar skulle inträffa behöver du bara återskapa synonymdefinitionen. Du behöver inte ändra några objektreferenser i frågor eftersom vi använder Synonym.

I ett annat fall skapar vi en synonym som pekar på tabellen [Azuredemodatabase].[SalesLT].[Produkt]. Sedan släpper vi tabellen och skapar en vy med ett liknande namn. I det här fallet kommer en synonym automatiskt att referera till vyn eftersom objektbindning sker med objektnamnet.

Om du flyttar ett objekt till en annan databas hjälper synonymen dig att minimera ansträngningarna när du gör ändringar. När du återskapar synonymen får alla SQL-frågor automatiskt den senaste objektplatsen.

Du kan också använda synonymer för att dölja databasobjektens namn. Användare kan fråga Synonymer för att hämta resultat istället för att fråga i bastabellen.

Du kan definiera en synonym i SQL Server för följande objekt:

  • Användardefinierad tabell
  • Lagrad procedur
  • Visa
  • Skalära och integrerade tabellvärderade funktioner
  • Lokala och globala tillfälliga tabeller
  • CLR lagrad procedur , funktioner (tabellvärderade, aggregerade, skalära)

Obs:Synonymnamnet bör vara unikt i en databas.

Var kan man använda synonymer i SQL Server

Vi kan använda synonymer i T-SQL-satsen, såsom Select, Update, Execute, Insert, Delete och sub-queries.

Vi kan dock inte använda synonymer i datadefinitionsspråk (DDL)-satser som Create och Alter. Synonymer är inte heller lämpliga för kontrollbegränsningar, beräknade kolumner, standarduttryck, regeluttryck, schemabundna vyer och funktioner.

Skapa en synonym i SQL Server i lokal server

För att skapa synonymer i SQL Server använder vi CREATE SYNONYM-satsen. Syntaxen är följande:

CREATE SYNONYM <synonym_name, sysname, sample_synonym>
  FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO

Låt oss till exempel skapa synonymen [MyProductCatalog] för [Azuredemodatabase].[SalesLT].[Produkt] .

CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]

När den väl har skapats kan du ersätta tabellnamnet med synonymen som visas nedan. Den refererar internt till bastabellen som vi refererade till i CREATE SYNONYM-satsen.

SELECT  [ProductID]
      ,[Name]
      ,[ProductNumber]
      ,[Color]
      ,[StandardCost]
      ,[ListPrice]
      ,[Size]
      ,[Weight]
      ,[ProductCategoryID]
      ,[ProductModelID]
      ,[SellStartDate]
      ,[SellEndDate]
      ,[DiscontinuedDate]
      ,[ThumbNailPhoto]
      ,[ThumbnailPhotoFileName]
      ,[rowguid]
      ,[ModifiedDate]
  FROM MyProductCatalog

Skapa en synonym i en databas på fjärrservern

Anta att objektet finns på en fjärrserver [ABC]. Du kan skapa en synonym för att undvika att ange ett 4-delat namn i frågor. I frågan nedan finns basobjektet i [MyRemoteServer]:

EXEC sp_addlinkedserver MyRemoteServer;
GO  
USE tempdb;  
GO  
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO

Skapa en synonym med SQL Server Management Studio

För att skapa synonymer kan vi använda gränssnittet för SQL Server Management Studio.

  • Anslut till din SQL-instans, expandera databasen och navigera till mappen Synonymer.
  • Högerklicka på den och välj Ny synonym.
  • Ange nödvändig information för synonymnamn, synonymschema, databasnamn, objektschema, objekttyp och namn.

I vårt exempel skapar vi en synonym i schemat [HumanResources], samma som i tabellschemat:

Klicka på Script för att få ett motsvarande T-SQL-skript enligt nedan:

USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR 
[AdventureWorks2017].[HumanResources].[Employee]
GO

Synonym för användardefinierade funktioner

Skapa först UDF dbo.TestSynonym med skriptet nedan:

CREATE FUNCTION dbo.TestSynonyn (@ID int)  
RETURNS int  
AS  
BEGIN  
IF @ID < 0  
BEGIN  
    SET @ID=100
END  
RETURN(@ID);  
END;  
GO

Skapa sedan en synonym för det med namnet dbo.UDFTest . Du kan anropa UDF med synonymen och hämta frågeresultaten:

CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;  
GO  
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue

Uppdatera uttalande och synonym

Anta att du vill uppdatera ett värde i SQL-tabellen. Om du har definierat en synonym på den kan du också använda den. Till exempel använder uppdateringssatsen nedan Synonym [Perofmancetest] istället för SQL-tabellnamnet:

Update performancetest set [Name]='Updated New value' where ID=1

Släpp en synonym

Du kan använda DROP SYNONYM-satsen för att släppa en specifik synonym i databasen. Frågan nedan tar bort [EmpData ] i AdventureWorks2017 databas:

Use AdventureWorks2017
Drop Synonym EmpData

Hämta listan över databassynonymer i SQL Server

Anta att du vill känna till befintliga synonymer i en databas tillsammans med deras basobjekt. Du kan fråga sys.synonyms systemkatalogvy i respektive databas:

SELECT 
    name, 
    base_object_name, 
    type
FROM 
    sys.synonyms

I frågeutgången får du följande information:

  • Synonymnamn
  • Basobjektet (3- eller 4-delat objektnamn)
  • Objekttyp (SN =Synonym)

Vad händer om vi ändrar synonymens basobjekt?

Låt oss överväga effekten av att ändra basobjektet för en synonym. Vi har en fråga för att utföra flera uppgifter:

  • Skapa en synonym (synonymnamnet är [dbo].[EmpData] för basobjektet [AdventureWorks2017].[DBO].[Emp] )
  • Släpp basobjektet (tabell) [AdventureWorks2017].[DBO].[Emp]
  • Skapa en vy med namnet [DBO].[Emp] i databasen [AdventureWorks2017].
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 nämnts tidigare binder synonymen ett objekt med dess namn. Således bör det peka ut till vyn istället för tabellen. I det här fallet finns inte tabellen [dbo].[Emp].

Som visas nedan är det en vy i [AdventureWorks2017] databas.

Alternativt kan du använda OBJECTPROPERTYEX() för att kontrollera synonymens objektbastyp:

SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;  
GO

Här refererar bastypen till databasvyn. När det gäller SQL-tabellen får du U i utgången.

Påverkar synonymer frågeresultatet negativt?

Många databasproffs föredrar att inte använda synonymer i SQL Server. Deras poäng är att SQL Server måste utföra ytterligare ett steg för att lösa bastabellen från synonymen. Det kan därför ge en negativ effekt.

Låt oss testa frågeprestanda. Vi hämtar poster från tabellnamnet och synonymen:

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

Låt oss först kontrollera den faktiska genomförandeplanen. Båda frågebatcherna har samma exekveringsplan och operatörskostnader:

På samma sätt har båda frågorna 41 logiska läsningar och en skanningsräkning för att hämta önskad utdata.

SQL Server löser synonymbasobjektnamnen i bindningsfasen av frågekörning. Detta händer före frågeoptimeringsfasen. Därför ser du en liknande genomförandeplan och ingen prestationspåverkan. Följaktligen kan du använda synonymer för att undvika långa 3-delade eller 4-delade namn för ofta åtkomliga objekt. Det påverkar inte frågeprestanda.

Det betyder inte att du skapar en synonym för varje objekt såsom en tabell, lagrad procedur, funktioner, vyer. Du kan använda dem för de mest använda objekten för att snabbt referera till dem i frågor.

Slutsats

Synonymer i SQL Server kan vara fördelaktiga. De förenklar databasobjektnamnen genom att undvika 3-delade eller 4-delade långa namn. Du kan använda dem för att referera till både lokala och fjärrobjekt. Det ger inga prestandaproblem. Därför kan du utforska att använda dem för flexibilitet när du skriver frågor. Det bästa av allt är dock att endast definiera synonymer för de ofta använda objekten i SQL-skript.


  1. Hur justify_days() fungerar i PostgreSQL

  2. Har inte databaslås! i android

  3. Oracle till PostgreSQL — Markörer och lträd

  4. Hur man får senaste månadsdata i MySQL