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.