同义词(数据库引擎)

同义词是具有以下用途的数据库对象:

  • 为另一个数据库对象(称为基对象)提供替代名称,该对象可存在于本地或远程服务器上。

  • 提供一层抽象,可保护客户端应用程序免受对基对象的名称或位置所做的更改。

例如,假设 Adventure Works 的 Employee 表位于名为 Server1 的服务器上。 若要从另一台服务器 Server2 引用此表,客户端应用程序必须使用由四部分构成的名称 Server1.AdventureWorks.Person.Employee。 此外,如果表的位置要更改为另一台服务器,则必须修改客户端应用程序以反映该更改。

若要解决这两个问题,可以在 Server1 上的 Employee 表的 Server2 上创建同义词 EmpTable。 现在,客户端应用程序只需使用单部分名称 EmpTable 来引用 Employee 表。 此外,如果 Employee 表的位置发生更改,则必须修改同义词 EmpTable,以指向 Employee 表的新位置。 由于没有 ALTER SYNONYM 语句,因此首先必须删除同义词 EmpTable,然后重新创建同名同义词,但将该同义词指向 Employee 的新位置。

同义词属于架构,与架构中的其他对象一样,同义词的名称必须是唯一的。 可以为以下数据库对象创建同义词:

程序集 (CLR) 存储过程 程序集 (CLR) 表值函数
程序集 (CLR) 标量函数 程序集 (CLR) 聚合函数
复制过滤过程 扩展存储过程
SQL 标量函数 SQL 表值函数
SQL 内联表值函数 SQL 存储过程
查看 1 (用户定义的)

1 包括本地和全局临时表

注释

不支持函数基对象的四部分名称。

同义词不能是另一个同义词的基对象,同义词不能引用用户定义的聚合函数。

同义词与其基对象之间的绑定仅按名称进行。 对基对象进行的所有存在、类型和权限检查都会延迟到运行时。 因此,可以修改、删除或删除基对象,并将其替换为与原始基对象同名的另一个对象。 例如,请考虑同义词 MyContacts,该同义词引用 Adventure Works 中的 Person.Contact 表。 如果 “联系人” 表被删除并替换为名为 Person.Contact 的视图, 则 MyContacts 现在引用 Person.Contact 视图。

对同义词的引用不是架构绑定的。 因此,可以随时删除同义词。 但是,通过删除同义词,你可能会对已删除的同义词留下悬而未定引用的风险。 这些引用只能在运行时找到。

同义词和架构

如果你有一个默认架构但不拥有它,并且想要创建同义词,则必须使用你自己拥有的架构的名称来限定同义词的名称。 例如,如果你拥有架构 x,但 y 是默认架构并使用 CREATE SYNONYM 语句,则必须将同义词的名称作为架构 x 的前缀,而不是使用单部分名称命名同义词。 有关如何创建同义词的详细信息,请参阅 CREATE SYNONYM (Transact-SQL)

授予对同义词的权限

只有同义词所有者、 db_owner成员或 db_ddladmin 的成员才能授予对同义词的权限。

可以对同义词授予、拒绝或撤销以下所有或任何权限:

控制 删除
执行 插入
选择 获取所有权
更新 视图定义

使用同义词

可以在多个 SQL 语句和表达式上下文中使用同义词代替其引用的基本对象。 下表包含这些语句和表达式上下文的列表:

选择 插入
更新 删除
执行 子选择

在前面所述的上下文中使用同义词时,基本对象将受到影响。 例如,如果同义词引用一个基对象,而你向同义词中插入一行,则实际上会将一行插入引用的表中。

注释

不能引用位于链接服务器上的同义词。

可以使用同义词作为OBJECT_ID函数的参数;但是,该函数返回同义词的对象 ID,而不是基对象。

不能在 DDL 语句中引用同义词。 例如,引用命名的 dbo.MyProduct同义词的以下语句将生成错误:

ALTER TABLE dbo.MyProduct  
   ADD NewFlag int null;  
EXEC ('ALTER TABLE dbo.MyProduct  
   ADD NewFlag int null');  

以下权限语句仅与同义词(而不是基对象)相关联:

授予 否认
撤销

同义词不是架构绑定的,因此,不能由以下架构绑定表达式上下文引用:

CHECK 约束 计算列
默认表达式 规则表达式
架构绑定视图 模式绑定函数

有关架构绑定函数的详细信息,请参阅创建用户定义的函数(数据库引擎)。

获取有关同义词的信息

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  

创建同义词

CREATE SYNONYM (Transact-SQL)

DROP SYNONYM (Transact-SQL)