jackyrong

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在SQL SERVER 2005中,终于出现了同义词了,大大方便了使用。

同义词是用来实现下列用途的数据库对象:

为本地或远程服务器上的另一个数据库对象(称为“基对象”)提供备选名称。

提供一个提取层,该层防止客户端应用程序的基对象的名称或位置被更改。

例如,名为 Server1 的服务器上有 Adventure Works 的 Employee 表。若要从另一台服务器 Server2 引用此表,客户端应用程序必须使用由四个部分构成的名称 Server1.AdventureWorks.Person.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.Contact 表的同义词 MyContacts。如果将 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


可以在一些 SQL 语句和表达式上下文中使用同义词替代其引用的基对象。下表包含了一些语句和表达式上下文。

SELECT
 INSERT
 
UPDATE
 DELETE
 
EXECUTE
 嵌套的 SELECT
 
出现在动态 SQL 中的 DML 和 DDL 语句。1
 
 

1 同义词无法与全文 DDL 一起使用。

在以前说明的上下文中使用同义词时,该基对象受到影响。例如,如果某个同义词引用了基对象(表)并且将行插入同义词中,则实际上将行插入到引用的表中。

注意: 
无法引用位于链接服务器上的同义词。
 


下列权限语句只与同义词关联,而不与基对象关联。

GRANT
 DENY
 
REVOKE
 
 

同义词不是绑定到架构的,因此无法被下列绑定到架构的表达式上下文所引用。

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

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

示例

以下示例首次创建将在此后的示例中使用的同义词。

USE tempdb;
GO
CREATE SYNONYM MyAddressType
FOR AdventureWorks.Person.AddressType;
GO
以下示例将行插入到由 MyAddressType 同义词引用的基表。

USE tempdb;
GO
INSERT INTO MyAddressType (Name)
VALUES ('Test');
GO
以下示例阐述了如何在动态 SQL 中引用同义词。

USE tempdb;
GO
EXECUTE ('SELECT Name FROM MyAddressType');
GO
 VIEW DEFINITION

posted on 2006-06-15 09:58  jackyrong的世界  阅读(5922)  评论(0编辑  收藏  举报