Синонимы (компонент Database Engine)
Синонимом является объект базы данных, который выполняет следующие функции:
предоставляет альтернативное имя для другого объекта базы данных, существующего на локальном или удаленном сервере, на которое затем ссылаются как на базовый объект;
обеспечивает уровень абстракции, защищающий клиентские приложения от изменений, производимых в имени или местоположении базовых объектов.
Например, рассмотрим таблицу Employee образца базы данных Adventure Works, расположенную на сервере Server1. Для доступа к этой таблице сервера Server2 клиентское приложение должно указать имя из четырех компонентов: Server1.AdventureWorks.Person.Employee. Если бы таблицу нужно было переместить, например, на другой сервер, клиентское приложение также надо было бы модифицировать, чтобы отобразить ее новое местоположение.
Для решения обеих этих проблем на сервере Server2 можно создать синоним — EmpTable —для таблицы Employee, расположенной на Server1. Теперь клиентскому приложению необходимо указывать имя таблицы, состоящее всего из одного элемента EmpTable, для обращения к таблице Employee. Кроме того, если местоположение таблицы Employee будет изменено, нужно будет только изменить синоним EmpTable, чтобы он указывал на новое местоположение таблицы Employee. Так как инструкции ALTER SYNONYM не существует, для этого сначала удаляют синоним EmpTable, а затем повторно создают его с тем же именем, указывая новое местоположение таблицы Employee.
Синоним принадлежит схеме, и, как и для всех остальных объектов схемы, имя синонима должно быть уникальным в ее пределах. Синонимы могут быть созданы для следующих объектов базы данных.
Хранимая процедура сборки (среда CLR) |
Возвращающая табличное значение функция сборки (среда CLR) |
Скалярная функция сборки (среда CLR) |
Агрегатная функция сборки (среда CLR) |
Процедура фильтра репликации |
Расширенная хранимая процедура |
Скалярная функция SQL |
Возвращающая табличное значение функция SQL |
Возвращающая табличное значение встроенная функция SQL |
Хранимая процедура SQL |
Представление |
Таблица1 (пользовательская) |
1 Включает локальные и глобальные временные таблицы.
![]() |
---|
Имена, состоящие из четырех элементов, для базовых объектов-функций не поддерживаются. |
Синоним не может быть базовым объектом для другого синонима, а также не может ссылаться на определяемую пользователем агрегатную функцию.
Синоним связан с его базовым объектом только по имени. Любые проверки на существование, тип и разрешения для базового объекта откладываются до стадии выполнения. Таким образом, базовый объект может быть изменен, удален или заменен другим объектом, имеющим то же имя, что и исходный. Например, предположим, что синоним MyContacts ссылается на таблицу Person.Contact в базе данных Adventure Works. Если таблица Contact удаляется и заменяется представлением с именем Person.Contact, синоним MyContacts будет указывать на представление Person.Contact.
Ссылки на синонимы не привязаны к схеме. Таким образом, синоним может быть удален в любой момент. Однако удаление синонима может оказаться чревато тем, что останутся несвязанные ссылки на него, что проявится только на стадии выполнения.
Синонимы и схемы
Если пользователь создает синоним в схеме, владельцем которой он не является, имя синонима необходимо предварять именем схемы, владельцем которой является пользователь. Например, если пользователь владеет схемой x, но текущей схемой является y, то при выполнении инструкции CREATE SYNONYM имя синонима необходимо предварять схемой x, а не указывать его по имени, состоящему из одного элемента. Дополнительные сведения о том, как создавать синонимы, см. в разделе CREATE SYNONYM (Transact-SQL).
Предоставление разрешений на синоним
Только владельцы синонима или члены ролей db_owner и db_ddladmin могут предоставлять разрешения на синоним.
Для синонима можно предоставить, запретить или отменить все или любые разрешения из нижеперечисленных:
CONTROL |
DELETE |
EXECUTE |
INSERT |
SELECT |
TAKE OWNERSHIP |
UPDATE |
VIEW DEFINITION |
Использование синонимов
Можно использовать синонимы вместо их базового объекта, на который они ссылаются, в нескольких инструкциях SQL и контекстах выражения. Следующая таблица содержит список этих инструкций и контекстов выражения.
SELECT |
INSERT |
UPDATE |
DELETE |
EXECUTE |
Подзапросы выборки |
При работе с синонимами в сформулированных ранее контекстах будет затронут базовый объект. Например, если синоним ссылается на базовый объект, который является таблицей, и строка вставляется в синоним, то фактически строка вставляется в таблицу, на которую ссылается синоним.
![]() |
---|
Нельзя сослаться на синоним, который расположен на связанном сервере. |
Синоним можно использовать в качестве параметра функции OBJECT_ID; однако эта функция вернет идентификатор объекта для синонима, а не для базового объекта.
Нельзя ссылаться на синоним в инструкции DDL. Например, следующие инструкции, ссылающиеся на синоним dbo.MyProduct, приведут к ошибке.
ALTER TABLE dbo.MyProduct
ADD NewFlag int null;
EXEC ('ALTER TABLE dbo.MyProduct
ADD NewFlag int null');
Следующие инструкции разрешений связаны только с синонимом, а не с базовым объектом.
GRANT |
DENY |
REVOKE |
|
Синонимы не привязаны к схеме, и поэтому на них нельзя сослаться следующими привязанными к схеме контекстами выражения.
Ограничения CHECK |
Вычисляемые столбцы |
Выражения по умолчанию |
Выражения правил |
Привязанные к схеме представления |
Привязанные к схеме функции |
Дополнительные сведения о привязанных к схеме функциях см. в разделе Создание определяемых пользователем функций (компонент Database Engine).
Получение данных о синонимах
Представление каталога sys.synonyms содержит запись для каждого синонима в данной базе данных. Это представление каталога обеспечивает доступ к таким метаданным, как имя синонима и имя базового объекта. Дополнительные сведения о представлении каталога sys.synonyms см. в разделе sys.synonyms (Transact-SQL).
С помощью расширенных свойств можно добавлять описательный или управляющий текст, маски ввода и правила форматирования в виде свойств синонима. Так как свойства хранятся в базе данных, все приложения, считывающие их, могут таким же образом вычислять объект. Дополнительные сведения см. в разделе sp_addextendedproperty (Transact-SQL).
Чтобы найти базовый тип базового объекта синонима, используйте функцию OBJECTPROPERTYEX. Дополнительные сведения см. в разделе OBJECTPROPERTYEX (Transact-SQL).
Примеры
В следующем примере будет возвращен базовый тип локального базового объекта синонима.
USE tempdb;
GO
CREATE SYNONYM MyEmployee
FOR AdventureWorks2012.HumanResources.Employee;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyEmployee'), 'BaseType') AS BaseType;
В следующем примере будет возвращен базовый тип удаленного базового объекта синонима, где базовый объект находится на сервере Server1.
EXECUTE sp_addlinkedserver Server1;
GO
CREATE SYNONYM MyRemoteEmployee
FOR Server1.AdventureWorks2012.HumanResources.Employee;
GO
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyRemoteEmployee'), 'BaseType') AS BaseType;
GO