南大通用GBase8s 常用SQL语句(六十七)
-
- CREATE SYNONYM 语句
使用 CREATE SYNONYM 语句为现有表、视图或序列对象声明并注册备用名。
该语句是 SQL ANSI/ISO 标准的扩展。
语法
元素 |
描述 |
限制 |
语法 |
sequence |
本地序列的名称 |
必须在当前数据库中存在 |
标识符 |
table, view |
正为其创建 synonym 的表或视图的名称 |
必须注册于当前数据库中,或者注册于限定符内指定的数据库中 |
数据库对象名 |
synonym |
在此处为 table 、view 或 sequence 的名称声明的同义词 |
在表对象名称中必须唯一的;另请参阅 Usage 说明 |
数据库对象名 |
用法
用户对同义词以及该同义词引用的数据库对象具有相同的特权。syssynonyms 、syssyntable 和 systables 系统目录表保存关于同义词的信息。
不能在同一数据库中为同义词创建同义词。
同义词的标识符必须在相同数据库中的表、临时表、外部表、视图和序列对象的名称中是唯一。(反之,请参阅带有相同名称的同义词 章节。)
如果您包含了可选 IF NOT EXISTS 关键字,则当指定名称的同义词已经在当前数据库中注册时,或指定的名称是当前数据库中表、视图、或序列对象的名称时,数据库不采取操作(而非向应用程序发送异常)。
一旦创建了同义词,则它会一直持续到所有者执行 DROP SYNONYM 语句。(此持久性将同义词与您能在 SELECT 语句的 FROM 子句中声明的别名区别开来;别名仅在 SELECT 语句的执行期间位于作用域内。)
如果同义词引用相同数据库中的表、视图或序列,则该同义词在所引用的表、视图或序列被删除时自动删除。有关其它信息,请参阅 外部数据库对象的同义词。
外部数据库对象的同义词
可以为您的会话当前连接的数据库服务器上任意数据库中的任意表或视图创建同义词。
此示例为当前数据库外的表在当前数据库服务器的 payables 数据库中声明同义词。
CREATE SYNONYM mysum FOR payables:jean.summary;
您也可以为 CREATE EXTERNAL TABLE 注册在当前数据库中的外部表创建同义词。(外部表要注册在创建它的数据库的系统目录中,而非存储它的任意数据库。)
您也可以为存在于某个数据库服务器的数据库中的表或视图创建同义词,该数据库服务器不是您的当前数据库服务器。当创建同义词时,这两个数据库服务器必须都处于联机状态。在网络中,远程数据库服务器验证该同义词引用的表或视图在创建同义词时是否存在。下一示例为由远程数据库服务器支持的表创建同义词:
CREATE SYNONYM mysum FOR payables@phoenix:jean.summary;
现在,标识符 mysum 引用表 jean.summary ,该表位于 phoenix 数据库服务器上的 payables 数据库中。如果从 payables 数据库删除了 summary 表,则 mysum 同义词保持不动。随后尝试使用 mysum 会返回错误:Table not found 。
然而, GBase 8s 并不支持这些外部对象的同义词:
- 类型表(包括作为表层次结构一部分的任何表)
- 包含任意扩展数据库类型的表或视图
- 本地数据库外的序列对象
PUBLIC 和 PRIVATE 同义词
如果使用 PUBLIC 关键字(或不使用任何关键字),则所有可以访问数据库的人都可以使用您的同义词。如果数据库不兼容 ANSI ,则用户不必知道公共同义词的所有者名称。位于不兼容 ANSI GBase 8s 数据库服务器内创建的数据库中的任意同义词都是公共同义词。
在兼容 ANSI 的数据库中,所有的同义词都是专用的。如果使用 PUBLIC 或 PRIVATE 关键字,则数据库服务器发出语法错误。
如果使用 PRIVATE 关键字在不兼容 ANSI 的数据库中声明同义词,则非限定的同义词可由其所有者使用。其他用户必须用所有者的名称限定同义词。
带有相同名称的同义词
在兼容 ANSI 的数据库中,owner.synonym 组合在所有同义词、表、视图以及序列中必须是唯一的。在引用不是您自己的同义词时必须指定 owner ,如下所示:
CREATE SYNONYM emp FOR accting.employee
在不兼容 ANSI 的数据库中,两个公共同义词不能有相同的标识符,而同义词的标识符也必须在相同数据库中的表、视图和序列的名称中是唯一的。
专用同义词的 owner.synonym 组合必须在数据库内所有同义词中是唯一的。即,同一数据库中可以存在多个带有相同名称的同义词,但是这些同义词中的每一个都必须归不同用户所有。同一用户不能同时创建名称相同的专用和公共同义词。例如,以下代码生成一个错误:
CREATE SYNONYM our_custs FOR customer;
CREATE PRIVATE SYNONYM our_custs FOR cust_calls;-- ERROR!!!
只有在两个同义词所有者不同的情况下,才能用与公共同义词相同的名称声明专用同义词。如果拥有一个专用同义词且存在带有相同名称的公共同义词,则数据库服务器未限定的名称解析诶专用同义词。(在这种情况下,您必须指定 owner.synonym 以引用公共同义词)如果在专用同义词和另一用户的公共同义词都有相同的标识符时,将 DROP SYNONYM 与未限定的同义词标识符一起使用,则仅删除专用同义词。如果重复相同的 DROP SYNONYM 语句,则数据库服务器删除公共同义词。
链接同义词
如果为不是当前数据库中的表或视图创建同义词,且已删除了此表或视图,则同义词保留在注册的目录中。可以用已删除的表或视图的名称作为同义词为删除的表或视图创建新的同义词,但是该同义词值指向当前数据库(而非另一个数据库)中的的表或视图。
以此方式,可将表或视图移至新的位置并链接仍然有效的原始的同义词。以此方法最多可以链接 16 个同义词。
链接同义词以引用已重新定位的表对象对表或视图是可能的,但是对指向序列对象的同义词无效,因为 CREATE SYNONYM 只能为已注册在当前数据库中的序列定义同义词。
以下步骤为 customer 表将两个同义词链接在一起,该表将最终驻留在 zoo 数据库服务器上。这里的省略号( . . . )表示 CREATE TABLE 语句不完整:
- 在称为 training 的数据库服务器上的 stores_demo 数据库中,发出以下语句:
CREATE TABLE customer (lname CHAR(15)...);
- 在称为 accntg 的数据库服务器上,发出以下语句:
CREATE SYNONYM cust FOR stores_demo@training:customer;
- 在称为 zoo 的数据库服务器上,发出以下语句:
CREATE TABLE customer (lname CHAR(15)...);
- 在称为 training 的数据库服务器上,发出以下语句:
DROP TABLE customer;
CREATE SYNONYM customer FOR stores_demo@zoo:customer;
accntg 数据库服务器上的同义词 cust 现在指向 zoo 数据库服务器上的 customer 表。
以下示例显示将两个同义词连接在一起并链接同义词指向的表的示例:
- 在称为 training 的数据库服务器上,发出以下语句:
CREATE TABLE customer (lname CHAR(15)...);
- 在称为 accntg 的数据库服务器上,发出以下语句:
CREATE SYNONYM cust FOR stores_demo@training:customer;
- 在称为 training 的数据库服务器上,发出以下语句:
DROP TABLE customer;
CREATE TABLE customer (lastname CHAR(20)...);
accntg 数据库服务器上的同义词 cust 现在指向 training 数据库服务器上的 customer 表。