例如,考虑位于名为 Server1
的服务器上的 Adventure Works 的 Employee
表。 若要从其他服务器
Server2
引用此表,则客户端应用程序必须使用由四个部分构成的名称
Server1.AdventureWorks.Person.Employee
。 另外,如果更改表的位置(例如,更改为其他服务器),则必须修改客户端应用程序以反映此更改。
要解决这两个问题,你可以在 Server2
上的专用或现有架构 RemoteObjects
中为 Server1
上的 Employee
表创建一个同义词 EmpTable
。 这样,客户端应用程序只需使用由两个部分构成的名称 RemoteObjects.EmpTable
来引用 Employee
表 Server1。 另外,如果
Employee
表的位置发生变化,则必须修改同义词
EmpTable
以指向
Employee
表的新位置。 由于不存在 ALTER SYNONYM 语句,因此必须首先删除同义词 RemoteObjects.EmpTable
,然后重新创建同名的同义词,但是现在要将同义词指向 Employee
的新位置。
同义词从属于架构,并且与架构中的其他对象一样,其名称必须是唯一的。 可以为下列数据库对象创建同义词:
程序集 (CLR) 存储过程
程序集 (CLR) 标量函数
复制筛选过程
SQL 标量函数
SQL 内联表值函数
程序集 (CLR) 表值函数
程序集 (CLR) 聚合函数
SQL 表值函数
SQL 存储过程
表*(用户定义)
*包括本地和全局临时表
不支持使用函数基对象的四部分名称。
同义词不能是另一个同义词的基对象,也不能引用用户定义聚合函数。
同义词与其基对象之间只是按名称绑定。 对基对象的存在性、类型和权限检查都在运行时执行。 因此,可以修改或删除基对象,也可以先删除基对象,然后用与原始基对象同名的另一个对象来替换该基对象。 例如,考虑引用 Adventure Works 中的 Person.Contact
表的同义词 dbo.MyContacts
。 如果将
Contact
表删除,并用名为
Person.Contact
的视图替换该表,则
MyContacts
将引用
Person.Contact
视图。
同义词的引用不是绑定到架构的。 因此,可以随时删除同义词。 但删除同义词后,会留下已删除同义词的无关联引用, 而只有在运行时才会发现这些引用。
同义词和架构
如果具有不属于你的默认架构并要创建同义词,则必须使用属于你的架构名称限定同义词名称。 例如,如果拥有架构 S1
,但 S2
是默认架构,那么使用 CREATE SYNONYM 语句时,必须在同义词名称前添加架构 S1
,而不是使用由一个部分构成的名称来命名同义词。 有关如何创建同义词的详细信息,请参阅
CREATE SYNONYM (Transact-SQL)
。
授予同义词的有关权限
只有同义词所有者、
db_owner
的成员或
db_ddladmin
的成员才能授予同义词的有关权限。
可以
GRANT
、
DENY
和
REVOKE
对同义词的下列所有权限或任一权限:
CONTROL
EXECUTE
SELECT
UPDATE
DELETE
INSERT
TAKE OWNERSHIP
VIEW DEFINITION
使用同义词
可以在一些 SQL 语句和表达式上下文中使用同义词替代其引用的基对象。 以下列包含这些语句和表达式上下文的列表:
SELECT
EXECUTE
INSERT
DELETE
嵌套的 SELECT
在以前说明的上下文中使用同义词时,该基对象会受到影响。 例如,如果某个同义词引用了基对象(表)并且将行插入同义词中,则实际上将行插入到引用的表中。
无法引用位于链接服务器上的同义词。
可以使用同义词作为 OBJECT_ID 函数的参数;但是,函数返回同义词的对象 ID,而不是基对象。
不能在 DDL 语句中引用同义词。 例如,引用名为
dbo.MyProduct
的同义词的下列语句将生成错误:
ALTER TABLE dbo.MyProduct
ADD NewFlag int null;
EXEC ('ALTER TABLE dbo.MyProduct
ADD NewFlag int null');
下列权限语句仅与同义词(而不是基对象)关联:
GRANT
REVOKE
因为同义词不绑定到架构,所以无法通过下列架构绑定表达式上下文引用:
CHECK 约束
默认表达式
绑定到架构的视图
规则表达式
绑定到架构的函数
有关绑定到架构的函数的详细信息,请参阅创建用户定义的函数(数据库引擎)。
sys.synonyms
目录视图包含给定的数据库中的所有同义词项。 该目录视图将显示同义词元数据,例如同义词的名称和基对象的名称。 有关详细信息,请参阅 sys.synonyms (Transact-SQL)。
使用扩展属性,你可以将描述性或说明性文本、输入掩码以及格式化规则添加为同义词的属性。 因为属性存储在数据库中,因此所有读取属性的应用程序都能以相同的方式评估对象。 有关详细信息,请参阅 sp_addextendedproperty (Transact-SQL)。
若要查找同义词基对象的基类型,请使用 OBJECTPROPERTYEX 函数。 有关详细信息,请参阅 OBJECTPROPERTYEX (Transact-SQL) 。
下面的示例将返回同义词基对象(本地对象)的基类型。
USE tempdb;
CREATE SCHEMA SynSchema
CREATE SYNONYM SynSchema.MyEmployee
FOR AdventureWorks2022.HumanResources.Employee;
SELECT OBJECTPROPERTYEX(OBJECT_ID('SynSchema.MyEmployee'), 'BaseType') AS BaseType;
下面的示例将返回同义词基对象(位于名为 Server1
的服务器上的远程对象)的基类型。
EXECUTE sp_addlinkedserver Server1;
CREATE SYNONYM SynSchema.MyRemoteEmployee
FOR Server1.AdventureWorks2022.HumanResources.Employee;
SELECT OBJECTPROPERTYEX(OBJECT_ID('MyRemoteEmployee'), 'BaseType') AS BaseType;
创建同义词
CREATE SYNONYM (Transact-SQL)
DROP SYNONYM (Transact-SQL)