sql >> Databáze >  >> RDS >> Sqlserver

Úvod do synonym v SQL Server

Synonyma v SQL Server jsou databázové objekty, které dávají alternativní název databázovým objektům existujícím lokálně nebo na vzdáleném serveru. Poskytují také abstrakční vrstvu, která chrání aplikaci před jakýmikoli změnami v základním objektu.

Ve skriptech T-SQL používáme k odkazování na databázové objekty 3dílná jména. Formát je:

[Databáze].[Schéma].[Objekt]

Předpokládejme například, že máme následující databázovou infrastrukturu:

  • Název databáze:[Azuredemodatabase]
  • Schéma:[SalesLT]
  • Objekt (název tabulky):Produkt

Příkaz SELECT s 3dílným názvem je následující:

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

Podobně vzdálený server používá čtyřdílnou konvenci pojmenování. Další částí je [název vzdáleného serveru]. Formát tedy bude

[Název serveru].[Databáze].[Schéma].[Objekt].

Představme si, že potřebujete přejmenovat [SalesLT].[Produkt] tabulky do [ProductData] .

Na tuto tabulku se odkazuje ve více uložených procedurách, funkcích a pohledech. Proto musíte upravit všechny takové odkazy v dotazech nebo klientských aplikacích tak, aby používali nejnovější název tabulky.

Můžete vytvořit synonymum odkazující na databázový objekt a použít ho ve svých dotazech SQL. Pokud dojde k jakýmkoli změnám, stačí znovu vytvořit definici synonym. Nebudete muset měnit žádné odkazy na objekty v dotazech, protože používáme Synonym.

V jiném případě vytvoříme synonymum, které ukazuje na tabulku [Azuredemodatabase].[SalesLT].[Produkt]. Poté tabulku zrušíme a vytvoříme pohled s podobným názvem. V tomto případě bude synonymum automaticky odkazovat na pohled, protože vazba objektu probíhá s názvem objektu.

Pokud přesunete objekt do jiné databáze, Synonym vám pomůže minimalizovat úsilí při provádění změn. Jakmile znovu vytvoříte synonymum, všechny dotazy SQL automaticky získají nejnovější umístění objektu.

Můžete také použít Synonyma ke skrytí názvů databázových objektů. Uživatelé mohou místo dotazování na základní tabulku dotazovat Synonyma.

Synonymum můžete definovat na serveru SQL Server pro následující objekty:

  • Uživatelsky definovaná tabulka
  • Uložená procedura
  • Zobrazit
  • Skalární a vložené tabulkové funkce
  • Místní a globální dočasné tabulky
  • Uložená procedura CLR, funkce (tabulkové, agregované, skalární)

Poznámka:Název synonyma by měl být v databázi jedinečný.

Kde používat synonyma v SQL Server

V příkazu T-SQL můžeme použít synonyma, jako jsou Select, Update, Execute, Insert, Delete a dílčí dotazy.

Synonyma však nemůžeme používat v příkazech jazyka definice dat (DDL), jako je Create a Alter. Synonyma také nejsou vhodná pro omezení kontroly, počítané sloupce, výchozí výrazy, výrazy pravidel, zobrazení vázaná na schéma a funkce.

Vytvořte synonymum v SQL Server na místním serveru

K vytvoření synonym na serveru SQL Server používáme příkaz CREATE SYNONYM. Syntaxe je následující:

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

Vytvořme například synonymum [MyProductCatalog] pro [Azuredemodatabase].[SalesLT].[Produkt] .

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

Jakmile je tabulka vytvořena, můžete nahradit název tabulky synonymem, jak je uvedeno níže. Interně odkazuje na základní tabulku, na kterou jsme odkazovali v příkazu CREATE SYNONYM.

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

Vytvořte synonymum v databázi na vzdáleném serveru

Předpokládejme, že objekt existuje na vzdáleném serveru [ABC]. Můžete vytvořit synonymum, abyste se vyhnuli zadávání 4dílného názvu v dotazech. V níže uvedeném dotazu je základní objekt v [MyRemoteServer]:

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

Vytvoření synonyma s SQL Server Management Studio

K vytvoření synonym můžeme použít GUI SQL Server Management Studio.

  • Připojte se ke své instanci SQL, rozbalte databázi a přejděte do složky Synonyma.
  • Klikněte na něj pravým tlačítkem a vyberte Nové synonymum.
  • Zadejte požadované podrobnosti pro název synonyma, schéma synonym, název databáze, schéma objektu, typ objektu a název.

V našem příkladu vytvoříme synonymum ve schématu [HumanResources], stejné jako ve schématu tabulky:

Klikněte na Skript získat ekvivalentní skript T-SQL, jak je uvedeno níže:

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

Synonymum pro uživatelem definované funkce

Nejprve vytvořte UDF dbo.TestSynonymum pomocí níže uvedeného skriptu:

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

Poté pro něj vytvořte synonymum s názvem dbo.UDFTest . Můžete volat UDF pomocí Synonyma a získat výsledky dotazu:

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

Aktualizovat prohlášení a synonymum

Předpokládejme, že chcete aktualizovat hodnotu v tabulce SQL. Pokud jste na něm definovali synonymum, můžete ho také použít. Například níže uvedené prohlášení o aktualizaci používá Synonymum [Perofmancetest] místo názvu tabulky SQL:

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

Vypuštění synonym

Příkaz DROP SYNONYM můžete použít k odstranění konkrétního synonyma z databáze. Níže uvedený dotaz vynechá [EmpData ] v AdventureWorks2017 databáze:

Use AdventureWorks2017
Drop Synonym EmpData

Získání seznamu databázových synonym na SQL Server

Předpokládejme, že chcete znát existující synonyma v databázi spolu s jejich základním objektem. Můžete se dotazovat na sys.synonyms zobrazení systémového katalogu v příslušné databázi:

SELECT 
    name, 
    base_object_name, 
    type
FROM 
    sys.synonyms

Ve výstupu dotazu získáte následující informace:

  • Název synonyma
  • Základní objekt (název objektu ze 3 nebo 4 částí)
  • Typ objektu ( SN =synonymum)

Co když změníme základní objekt synonyma?

Zvažme dopad úpravy základního objektu synonyma. Máme dotaz k provedení několika úkolů:

  • Vytvořte synonymum (název synonyma je [dbo].[EmpData] pro základní objekt [AdventureWorks2017].[DBO].[Emp] )
  • Zrušte základní objekt (tabulku) [AdventureWorks2017].[DBO].[Emp]
  • Vytvořte pohled s názvem [DBO].[Emp] v databázi [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

Jak již bylo zmíněno dříve, Synonymum váže objekt pomocí jeho názvu. Mělo by tedy ukazovat na pohled místo na tabulku. V tomto případě tabulka [dbo].[Emp] neexistuje.

Jak je uvedeno níže, jedná se o zobrazení v [AdventureWorks2017] databáze.

Případně můžete použít OBJECTPROPERTYEX() pro kontrolu základního typu objektu synonyma:

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

Zde typ Base odkazuje na pohled databáze. V případě tabulky SQL získáte U ve výstupu.

Ovlivňují synonyma negativně výkon dotazu?

Mnoho databázových profesionálů raději nepoužívá synonyma v SQL Server. Jde o to, že SQL Server musí provést další krok při řešení základní tabulky ze Synonyma. Mohlo by to mít negativní efekt.

Pojďme otestovat výkon dotazu. Záznamy získáváme z názvu tabulky a synonyma:

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

Nejprve se podívejme na skutečný plán realizace. Obě dávky dotazů mají stejný plán provádění a náklady na operátora:

Podobně mají oba dotazy 41 logických čtení a jeden počet skenů pro získání požadovaného výstupu.

SQL Server řeší synonyma základní názvy objektů ve fázi vazby provádění dotazu. K tomu dochází před fází optimalizace dotazu. Proto uvidíte podobný plán provádění a žádný dopad na výkon. V důsledku toho můžete používat synonyma, abyste se vyhnuli dlouhým 3- nebo 4-dílným názvům pro často používané objekty. Nemá to vliv na výkon dotazu.

Neznamená to, že vytvoříte synonymum pro každý objekt, jako je tabulka, uložená procedura, funkce, pohledy. Můžete je použít pro nejčastěji používané objekty pro rychlé odkazování na ně v dotazech.

Závěr

Synonyma v SQL Server mohou být prospěšná. Zjednodušují názvy databázových objektů tím, že se vyhýbají 3dílným nebo 4dílným dlouhým názvům. Můžete je použít pro odkazování na místní i vzdálené objekty. Nevyvolává žádné problémy s výkonem. Proto můžete prozkoumat jejich použití pro flexibilitu při psaní dotazů. Nejlepší ze všeho je však definovat synonyma pouze pro často používané objekty ve skriptech SQL.


  1. Vypuštění připojeného uživatele ze schématu databáze Oracle 10g

  2. Přístup k datům z Raspberry Pi

  3. Oracle:Vyberte z datového typu záznamu

  4. Více aktualizací v MySQL