sql >> Database >  >> RDS >> Sqlserver

Inleiding tot synoniemen in SQL Server

Een synoniem in SQL Server zijn database-objecten die een alternatieve naam geven aan de database-objecten die lokaal of op de externe server bestaan. Ze bieden ook een abstractielaag om de toepassing te beschermen tegen eventuele wijzigingen in het basisobject.

In T-SQL-scripts gebruiken we 3-delige namen om naar database-objecten te verwijzen. Het formaat is:

[Database].[Schema].[Object]

Stel dat we bijvoorbeeld de volgende database-infrastructuur hebben:

  • Databasenaam:[Azuredemodatabase]
  • Schema:[SalesLT]
  • Object(tabelnaam):Product

De SELECT-instructie met de 3-delige naam is als volgt:

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

Evenzo gebruikt een externe server de 4-delige naamgevingsconventie. Het extra deel is [naam externe server]. Het formaat is dus

[Servernaam].[Database].[Schema].[Object].

Stel je voor dat je de naam van de [SalesLT].[Product] . moet hernoemen tabel naar [ProductData] .

Er wordt naar deze tabel verwezen in meerdere opgeslagen procedures, functies en weergaven. Daarom moet u al dergelijke verwijzingen in query's of clienttoepassingen wijzigen om de laatste naam van de tabel te gebruiken.

U kunt een synoniem maken dat verwijst naar het databaseobject en dit gebruiken in uw SQL-query's. Mochten er wijzigingen plaatsvinden, dan hoeft u alleen de definitie van het synoniem opnieuw te maken. U hoeft geen objectverwijzingen in query's te wijzigen omdat we Synoniem gebruiken.

In een ander geval maken we een synoniem dat verwijst naar tabel [Azuredemodatabase].[SalesLT].[Product]. Vervolgens laten we de tabel vallen en maken we een weergave met een vergelijkbare naam. In dit geval verwijst een synoniem automatisch naar de weergave omdat objectbinding plaatsvindt met de objectnaam.

Als u een object naar een andere database verplaatst, helpt het Synoniem u om de inspanningen bij het aanbrengen van wijzigingen te minimaliseren. Zodra u het synoniem opnieuw hebt gemaakt, krijgen alle SQL-query's automatisch de nieuwste objectlocatie.

U kunt ook synoniemen gebruiken om de namen van de databaseobjecten te verbergen. Gebruikers kunnen Synoniemen opvragen om resultaten op te halen in plaats van de basistabel te doorzoeken.

U kunt een synoniem in SQL Server definiëren voor de volgende objecten:

  • Door gebruiker gedefinieerde tabel
  • Opgeslagen procedure
  • Bekijken
  • Scalaire en inline tabelwaardefuncties
  • Lokale en wereldwijde tijdelijke tabellen
  • CLR opgeslagen procedure , functies (tabelwaarde, aggregaat, scalair)

Opmerking:de naam van het synoniem moet uniek zijn in een database.

Waar synoniemen te gebruiken in SQL Server

We kunnen synoniemen gebruiken in de T-SQL-instructie, zoals Selecteren, Updaten, Uitvoeren, Invoegen, Verwijderen en subquery's.

We kunnen echter geen synoniemen gebruiken in DDL-instructies (Data Definition Language) zoals Create en Alter. Synoniemen zijn ook niet geschikt voor controlebeperkingen, berekende kolommen, standaarduitdrukkingen, regeluitdrukkingen, schemagebonden weergaven en functies.

Maak een synoniem in SQL Server in Local Server

Om Synoniemen in SQL Server te maken, gebruiken we de instructie CREATE SYNONYM. De syntaxis is als volgt:

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

Laten we bijvoorbeeld het synoniem maken [MyProductCatalog] voor [Azuredemodatabase].[SalesLT].[Product] .

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

Zodra het is gemaakt, kunt u de tabelnaam vervangen door het synoniem zoals hieronder weergegeven. Het verwijst intern naar de basistabel waarnaar we verwezen in de instructie CREATE SYNONYM.

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

Maak een synoniem in een database op de externe server

Stel dat het object bestaat in een externe server [ABC]. U kunt een synoniem maken om te voorkomen dat u een 4-delige naam opgeeft in query's. In de onderstaande query bevindt het basisobject zich in de [MyRemoteServer]:

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

Een synoniem maken met SQL Server Management Studio

Om synoniemen te maken, kunnen we de GUI van SQL Server Management Studio gebruiken.

  • Maak verbinding met uw SQL-instantie, vouw de database uit en navigeer naar de map Synoniemen.
  • Klik er met de rechtermuisknop op en kies Nieuw synoniem.
  • Voer de vereiste details in voor de synoniemnaam, het synoniemschema, de databasenaam, het objectschema, het objecttype en de naam.

In ons voorbeeld maken we een synoniem in het schema [HumanResources], hetzelfde als in het tabelschema:

Klik op Script om een ​​gelijkwaardig T-SQL-script te krijgen zoals hieronder:

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

Synoniem voor door de gebruiker gedefinieerde functies

Maak eerst de UDF dbo.TestSynonym met behulp van het onderstaande script:

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

Maak er vervolgens een synoniem voor met de naam dbo.UDFTest . U kunt de UDF bellen met het synoniem en de zoekresultaten ophalen:

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

Updateverklaring en synoniem

Stel dat u een waarde in de SQL-tabel wilt bijwerken. Als u er een synoniem voor heeft gedefinieerd, kunt u dit ook gebruiken. De onderstaande update-instructie gebruikt bijvoorbeeld Synoniem [Perofmancetest] in plaats van de SQL-tabelnaam:

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

Een synoniem laten vallen

U kunt de instructie DROP SYNONYM gebruiken om een ​​specifiek synoniem in de database te verwijderen. De onderstaande zoekopdracht laat [EmpData vallen ] in de AdventureWorks2017 databank:

Use AdventureWorks2017
Drop Synonym EmpData

De lijst met databasesynoniemen in SQL Server ophalen

Stel dat u bestaande synoniemen in een database wilt weten, samen met hun basisobject. U kunt de sys.synoniemen . opvragen systeemcatalogusweergave in de respectieve database:

SELECT 
    name, 
    base_object_name, 
    type
FROM 
    sys.synonyms

In de query-uitvoer krijgt u de volgende informatie:

  • Synoniemnaam
  • Het basisobject (3-delige of 4-delige objectnaam)
  • Objecttype ( SN =synoniem)

Wat als we het basisobject van het synoniem wijzigen?

Laten we eens kijken naar de impact van het wijzigen van het basisobject van een synoniem. We hebben een verzoek om verschillende taken uit te voeren:

  • Maak een synoniem (de naam van het synoniem is [dbo].[EmpData] voor het basisobject [AdventureWorks2017].[DBO].[Emp] )
  • Laat het basisobject (tabel) [AdventureWorks2017].[DBO].[Emp]
  • vallen
  • Maak een weergave met de naam [DBO].[Emp] in de [AdventureWorks2017]-database.
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

Zoals eerder vermeld, bindt het synoniem een ​​object met zijn naam. Het zou dus moeten wijzen op de weergave in plaats van op de tabel. In dit geval bestaat de [dbo].[Emp]-tabel niet.

Zoals hieronder getoond, is het een weergave in de [AdventureWorks2017] database.

U kunt ook OBJECTPROPERTYEX() . gebruiken om het type objectbasis van het synoniem te controleren:

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

Hier verwijst het basistype naar de databaseweergave. In het geval van de SQL-tabel krijg je U in de uitvoer.

Hebben synoniemen een negatieve invloed op de prestaties van zoekopdrachten?

Veel databaseprofessionals gebruiken liever geen synoniemen in SQL Server. Hun punt is dat SQL Server een extra stap moet uitvoeren bij het oplossen van de basistabel van het synoniem. Het kan dus een negatief effect hebben.

Laten we de prestaties van de query testen. We halen records op uit de tabelnaam en het synoniem:

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

Laten we eerst het daadwerkelijke uitvoeringsplan controleren. Beide querybatches hebben hetzelfde uitvoeringsplan en dezelfde operatorkosten:

Evenzo hebben beide zoekopdrachten 41 logische uitlezingen en één scantelling voor het ophalen van de gewenste uitvoer.

SQL Server lost de namen van synoniemenbasisobjecten op in de bindingsfase van het uitvoeren van query's. Dit gebeurt vóór de fase van de query-optimalisatie. Daarom ziet u een vergelijkbaar uitvoeringsplan en geen prestatie-impact. Daarom kunt u synoniemen gebruiken om lange 3-delige of 4-delige namen voor veelgebruikte objecten te vermijden. Het heeft geen invloed op de prestaties van zoekopdrachten.

Het betekent niet dat u een synoniem maakt voor elk object, zoals een tabel, opgeslagen procedure, functies, weergaven. U kunt ze gebruiken voor de meest gebruikte objecten om er snel naar te verwijzen in zoekopdrachten.

Conclusie

Synoniemen in SQL Server kunnen nuttig zijn. Ze vereenvoudigen de database-objectnamen door 3-delige of 4-delige lange namen te vermijden. U kunt ze gebruiken om te verwijzen naar zowel lokale als externe objecten. Het levert geen prestatieproblemen op. Daarom kunt u ze gebruiken voor flexibiliteit bij het schrijven van query's. Het beste is echter om alleen synoniemen te definiëren voor de veelgebruikte objecten in SQL-scripts.


  1. Mag je getallen als tabelnamen gebruiken in MySQL?

  2. Meerdere CTE in één zoekopdracht

  3. MAAK Oracle-procedure

  4. sql ORDER DOOR meerdere waarden in een specifieke volgorde?