Синоними в SQL Server са обекти на база данни, които дават алтернативно име на обектите на базата данни, съществуващи локално или на отдалечения сървър. Освен това те осигуряват абстракционен слой за защита на приложението от всякакви промени в основния обект.
В T-SQL скриптовете ние използваме имена от 3 части за препращане към обекти на база данни. Форматът е:
[База данни].[Схема].[Обект]
Например, да предположим, че имаме следната инфраструктура на базата данни:
- Име на базата данни:[Azuredemodatabase]
- Схема:[SalesLT]
- Обект(име на таблица):Продукт
Инструкцията SELECT с име от 3 части е както следва:
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM [Azuredemodatabase].[SalesLT].[Product]
По същия начин, отдалечен сървър използва конвенцията за именуване от 4 части. Допълнителната част е [име на отдалечен сървър]. Следователно форматът ще бъде
[Име на сървъра].[База данни].[Схема].[Обект].
Нека си представим, че трябва да преименувате [SalesLT].[Продукт] таблица към [ProductData] .
Тази таблица се споменава в множество съхранени процедури, функции и изгледи. Следователно трябва да промените всички такива препратки в заявки или клиентски приложения, за да използвате най-новото име на таблицата.
Можете да създадете синоним, препращащ обекта на базата данни и да го използвате във вашите SQL заявки. Ако настъпят някакви промени, трябва само да пресъздадете дефиницията на синоним. Няма да е необходимо да променяте препратки към обекти в заявките, защото използваме синоним.
В различен случай създаваме синоним, който сочи към таблица [Azuredemodatabase].[SalesLT].[Продукт]. След това пускаме таблицата и създаваме изглед с подобно име. В този случай синонимът автоматично ще препраща към изгледа, тъй като свързването на обекта се случва с името на обекта.
Ако преместите обект в друга база данни, синонимът ви помага да сведете до минимум усилията, когато правите промени. След като пресъздадете синонима, всички SQL заявки автоматично получават най-новото местоположение на обекта.
Можете също да използвате синоними, за да скриете имената на обектите на базата данни. Потребителите могат да търсят синоними за извличане на резултати, вместо да правят заявки към основната таблица.
Можете да дефинирате синоним в SQL Server за следните обекти:
- Таблица, дефинирана от потребителя
- Запазена процедура
- Преглед
- Скаларни и вградени функции с таблично стойности
- Локални и глобални временни таблици
- Съхранена процедура, функции в CLR (с таблица, агрегат, скалар)
Забележка:Името на синоним трябва да е уникално в база данни.
Къде да използвате синоними в SQL Server
Можем да използваме синоними в израза на T-SQL, като Select, Update, Execute, Insert, Delete и подзаявки.
Въпреки това, не можем да използваме синоними в изразите на езика за дефиниране на данни (DDL), като Създаване и Промяна. Освен това синонимите не са подходящи за ограничения за проверка, изчислени колони, изрази по подразбиране, изрази за правила, изгледи, свързани със схема, и функции.
Създайте синоним в SQL Server в локален сървър
За да създадем синоними в SQL Server, ние използваме израза CREATE SYNONYM. Синтаксисът е следният:
CREATE SYNONYM <synonym_name, sysname, sample_synonym>
FOR <schema_name, sysname, Production>.<object_name, sysname, Product>
GO
Например, нека създадем синоним [MyProductCatalog] за [Azuredemodatabase].[SalesLT].[Продукт] .
CREATE SYNONYM MyProductCatalog FOR [Azuredemodatabase].[SalesLT].[Product]
След като бъде създадена, можете да замените името на таблицата със синоним, както е показано по-долу. Той вътрешно препраща към базовата таблица, която посочихме в израза CREATE SYNONYM.
SELECT [ProductID]
,[Name]
,[ProductNumber]
,[Color]
,[StandardCost]
,[ListPrice]
,[Size]
,[Weight]
,[ProductCategoryID]
,[ProductModelID]
,[SellStartDate]
,[SellEndDate]
,[DiscontinuedDate]
,[ThumbNailPhoto]
,[ThumbnailPhotoFileName]
,[rowguid]
,[ModifiedDate]
FROM MyProductCatalog
Създайте синоним в база данни на отдалечения сървър
Да предположим, че обектът съществува в отдалечен сървър [ABC]. Можете да създадете синоним, за да избегнете посочването на име от 4 части в заявките. В заявката по-долу основният обект е в [MyRemoteServer]:
EXEC sp_addlinkedserver MyRemoteServer;
GO
USE tempdb;
GO
CREATE SYNONYM MyProductCatalog FOR MyRemoteServer.[Azuredemodatabase].[SalesLT].[Product]
GO
Създаване на синоним със SQL Server Management Studio
За да създадем синоними, можем да използваме графичния интерфейс на SQL Server Management Studio.
- Свържете се с вашия SQL екземпляр, разширете базата данни и отидете до папката Synonyms.
- Щракнете с десния бутон върху него и изберете Нов синоним.
- Въведете необходимите подробности за име на синоним, схема на синоним, име на база данни, схема на обект, тип на обект и име.
В нашия пример създаваме синоним в схемата [HumanResources], същият като в схемата на таблицата:
Кликнете върху Скрипт за да получите еквивалентен T-SQL скрипт, както е показано по-долу:
USE [AdventureWorks2017]
GO
CREATE SYNONYM [HumanResources].[MyEmpData] FOR
[AdventureWorks2017].[HumanResources].[Employee]
GO
Синоним за дефинирани от потребителя функции
Първо създайте UDF dbo.TestSynonym като използвате скрипта по-долу:
CREATE FUNCTION dbo.TestSynonyn (@ID int)
RETURNS int
AS
BEGIN
IF @ID < 0
BEGIN
SET @ID=100
END
RETURN(@ID);
END;
GO
След това създайте синоним за него с името dbo.UDFTest . Можете да извикате UDF с помощта на синоним и да извлечете резултатите от заявката:
CREATE SYNONYM dbo.UDFTest FOR dbo.TestSynonyn;
GO
Declare @ID INT=-10
Select @ID as OrigninalValue, dbo.UDFTest(@ID) as modifiedValue
Изявление за актуализация и синоним
Да предположим, че искате да актуализирате стойност в SQL таблицата. Ако сте дефинирали синоним върху него, можете също да го използвате. Например, изявлението за актуализиране по-долу използва Синоним [Perofmancetest] вместо името на SQL таблицата:
Update performancetest set [Name]='Updated New value' where ID=1
Изпускане на синоним
Можете да използвате израза DROP SYNONYM, за да пуснете конкретен синоним в базата данни. Заявката по-долу отпада [EmpData ] вAdventureWorks2017 база данни:
Use AdventureWorks2017
Drop Synonym EmpData
Получаване на списък със синоними на база данни в SQL Server
Да приемем, че искате да знаете съществуващи синоними в база данни заедно с техния основен обект. Можете да направите заявка за sys.synonyms изглед на системния каталог в съответната база данни:
SELECT
name,
base_object_name,
type
FROM
sys.synonyms
В изхода на заявката получавате следната информация:
- Име на синоним
- Основният обект (име на обект от 3 или 4 части)
- Тип обект (SN =Синоним)
Ами ако модифицираме основния обект на синоним?
Нека разгледаме ефекта от модифицирането на основния обект на синоним. Имаме заявка за изпълнение на няколко задачи:
- Създайте синоним (името на синоним е [dbo].[EmpData] за базовия обект [AdventureWorks2017].[DBO].[Emp] )
- Изхвърлете основния обект (таблица) [AdventureWorks2017].[DBO].[Emp]
- Създайте изглед с името [DBO].[Emp] в базата данни [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
Както бе споменато по-рано, синонимът свързва обект, използвайки неговото име. По този начин той трябва да сочи към изгледа вместо към таблицата. В този случай таблицата [dbo].[Emp] не съществува.
Както е показано по-долу, това е изглед в [AdventureWorks2017] база данни.
Като алтернатива можете да използвате OBJECTPROPERTYEX() за да проверите основния тип обект на синонима:
SELECT OBJECTPROPERTYEX(OBJECT_ID('Emp'), 'BaseType') AS BaseType;
GO
Тук основният тип препраща към изгледа на базата данни. В случая на SQL таблицата получавате U в изхода.
Влияят ли синонимите отрицателно върху производителността на заявката?
Много специалисти по бази данни предпочитат да не използват синоними в SQL Server. Техният смисъл е, че SQL Server трябва да извърши допълнителна стъпка в разрешаването на основната таблица от синонима. По този начин може да има отрицателен ефект.
Нека тестваме ефективността на заявката. Извличаме записи от името на таблицата и синонима:
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
Първо, нека проверим действителния план за изпълнение. И двата пакета заявки имат един и същ план за изпълнение и операторски разходи:
По същия начин и двете заявки имат 41 логически четения и един брой сканирания за извличане на желания изход.
SQL Server разрешава синонимните основни имена на обекти във фазата на свързване на изпълнение на заявката. Това се случва преди фазата на оптимизиране на заявката. Следователно виждате подобен план за изпълнение и няма влияние върху производителността. Следователно можете да използвате синоними, за да избегнете дълги имена от 3 или 4 части за често достъпни обекти. Това не оказва влияние върху ефективността на заявката.
Това не означава, че създавате синоним за всеки обект като таблица, съхранена процедура, функции, изгледи. Можете да ги използвате за най-често достъпни обекти за бърза справка с тях в заявки.
Заключение
Синонимите в SQL Server могат да бъдат полезни. Те опростяват имената на обекти на базата данни, като избягват дълги имена от 3 или 4 части. Можете да ги използвате за препращане както към локални, така и към отдалечени обекти. Не създава проблеми с производителността. Следователно можете да проучите използването им за гъвкавост при писане на заявки. Най-доброто от всичко обаче е да дефинирате синоними само за често използвани обекти в SQL скриптове.