使用表名的同义词

同义词是可以用来替换另一个 SQL 标识的名称。 可使用 CREATE SYNONYM 语句来声明表、视图或(对于 GBase 8s)序列对象的备用名称。

通常,使用同义词来引用不在当前数据库中的表。例如:可以执行下列语句来创建 customerorders 表名的同义词:
CREATE SYNONYM mcust FOR masterdb@central:customer;
CREATE SYNONYM bords FOR sales@boston:orders;
创建同义词之后,可以在原始表名有效的许多上下文中使用该同义词,如以下示例所示:
SELECT bords.order_num, mcust.fname, mcust.lname
      FROM mcust, bords
      WHERE mcust.customer_num = bords.Customer_num
      INTO TEMP mycopy; 

CREATE SYNONYM 语句在当前数据库中的系统目录表 syssyntable 中存储同义词名称。该同义词可用于在该数据库中进行的任何查询。 (然而如果设置了 USETABLENAME 环境变量,那么 SQL 的某些 DDL 语句不支持用同义词代替表名。)

简短的同义词可以简化查询的编写工作,但同义词也可以扮演另一角色。它们允许将表移至另一个数据库中,甚至移至另一台计算机,同时保持查询不变。

假设有几个引用表 customerorders 的查询。这些查询嵌入在程序、表单和报告中。这些表是演示数据库的一部分,演示数据库存放在数据库服务器 avignon 上。

现在,您决定将这些程序、表单和报告提供给网络中的另一台计算机(数据库服务器 nantes)的用户使用。那些用户有包含表 orders(该表包含他们所在位置的订单)的数据库,但他们必须能够访问 avignon 上的表 customer

对于那些用户,customer 表是外部的。这表示必须准备特殊版本(即必须用数据库服务器名对 customer 表加以限定的版本)的程序和报告吗?更好的解决方案是在用户的数据库中创建同义词,如以下示例所示:
DATABASE stores_demo@nantes;
CREATE SYNONYM customer FOR stores_demo@avignon:customer;

当在您的数据库中执行存储查询时,名称 customer 指的是实际的表。当在其他数据库中执行那些查询时,该名称会通过同义词解析为对存在于数据库服务器 avignon 上的表的引用。(在不符合 ANSI 标准的数据库中,同义词必须在数据库中的同义词、表、视图和顺序对象的名称中具有唯一性。在符合 ANSI 标准的数据库中,owner.synonym 组合必须在使用 tabid 值在数据库中注册的对象名称空间中具有唯一性。)