同义词简介
同义词是用来实现下列用途的数据库对象:
为可以存在于本地或远程服务器上的其他数据库对象(称为基对象)提供备用名称。
提供抽象层以免对客户端应用程序基对象的名称或位置进行更改。
例如,名为 Server1 的服务器上有 AdventureWorks2008R2 示例数据库的 Employee 表。若要从另一服务器 Server2 引用此表,则客户端应用程序必须使用由四个部分构成的名称 Server1.AdventureWorks.HumanResources.Employee。另外,如果更改表的位置(例如,更改为另一服务器),则必须修改客户端应用程序以反映此更改。
若要解决这两个问题,您可以在 Server2 上为 Server1 上的 Employee 表创建一个同义词 EmpTable。这样,客户端应用程序只需使用由一个部分构成的名称 EmpTable 来引用 Employee 表。另外,如果 Employee 表的位置发生变化,则必须修改同义词 EmpTable 以指向 Employee 表的新位置。由于不存在 ALTER SYNONYM 语句,因此必须首先删除同义词 EmpTable,然后重新创建同名的同义词,但是要将同义词指向Employee 的新位置。
同义词从属于架构,并且与架构中的其他对象一样,其名称必须是唯一的。可以为下列数据库对象创建同义词:
程序集 (CLR) 存储过程 |
程序集 (CLR) 表值函数 |
程序集 (CLR) 标量函数 |
程序集 (CLR) 聚合函数 |
复制筛选过程 |
扩展存储过程 |
SQL 标量函数 |
SQL 表值函数 |
SQL 内联表值函数 |
SQL 存储过程 |
视图 |
表1(用户定义) |
1 包括本地和全局临时表
注意 |
---|
不支持使用函数基对象的四部分名称。 |
同义词不能是另一个同义词的基对象,也不能引用用户定义聚合函数。
同义词与其基对象之间只是按名称绑定。对基对象的存在性、类型和权限检查都在运行时执行。因此,可以修改或删除基对象,也可以先删除基对象,然后用与原始基对象同名的另一个对象来替换该基对象。例如,有一个引用 Adventure Works 中的 Person.Person 表的同义词 MyContacts。如果将 Person 表删除并用名为 Person.Person 的视图替换该表,则 MyContacts 将引用 Person.Person 视图。
同义词的引用不是绑定到架构的。因此,可以随时删除同义词。但删除同义词后,会留下已删除同义词的无关联引用,而只有在运行时才会发现这些引用。
同义词和架构
如果具有不属于您的默认架构并要创建同义词,则必须使用属于您的架构名称限定同义词名称。例如,如果您拥有架构 x,但 y 是默认架构,那么使用 CREATE SYNONYM 语句时,必须在同义词名称前添加架构 x 作为同义词前缀,而不是使用由一个部分构成的名称来命名同义词。有关如何创建同义词的详细信息,请参阅 CREATE SYNONYM (Transact-SQL)。
授予同义词的有关权限
只有同义词所有者、db_owner 的成员或 db_ddladmin 的成员才能授予同义词的有关权限。
可以授予、拒绝和撤消对同义词的下列所有权限或任一权限:
CONTROL |
DELETE |
EXECUTE |
INSERT |
SELECT |
TAKE OWNERSHIP |
UPDATE |
VIEW DEFINITION |