返回首页

gbase数据、南大通用产品文档:GBase8sCREATE SYNONYM 语句

更新日期:2024年09月11日

使用 CREATE SYNONYM 语句为现有表、视图或序列对象声明并注册备用名。
该语句是 SQL ANSI/ISO 标准的扩展。
语法

元素
描述
限制
语法
sequence 本地序列的名称
必须在当前数据库中存在 标识符

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 346
元素
描述
限制
语法
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;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 347
您也可以为 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 ,如下所示:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 348
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 语句不完整:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 349
1. 在称为 training 的数据库服务器上的 stores_demo 数据库中,发出以下语
句:
CREATE TABLE customer (lname CHAR(15)...);
2. 在称为 accntg 的数据库服务器上,发出以下语句:
CREATE SYNONYM cust FOR stores_demo@training:customer;
3. 在称为 zoo 的数据库服务器上,发出以下语句:
CREATE TABLE customer (lname CHAR(15)...);
4. 在称为 training 的数据库服务器上,发出以下语句:
DROP TABLE customer;
CREATE SYNONYM customer FOR stores_demo@zoo:customer;
accntg 数据库服务器上的同义词 cust 现在指向 zoo 数据库服务器上的
customer 表。
以下示例显示将两个同义词连接在一起并链接同义词指向的表的示例:
1. 在称为 training 的数据库服务器上,发出以下语句:
CREATE TABLE customer (lname CHAR(15)...);
2. 在称为 accntg 的数据库服务器上,发出以下语句:
CREATE SYNONYM cust FOR stores_demo@training:customer;
3. 在称为 training 的数据库服务器上,发出以下语句:
DROP TABLE customer;
CREATE TABLE customer (lastname CHAR(20)...);
accntg 数据库服务器上的同义词 cust 现在指向 training 数据库服务器上的
customer 表。

Type requested (%s) does not match row type information (%s) type
从系统目录或行定义获取行类型信息。提供的行数据与该行的元素类型不匹配。必须修改
类型信息或必须提供数据。

sysdistrib 系统目录表存储数据分发信息以供查询优化器使用。数据分发为优化器提
供了详细的表和列信息以改进 SELECT 语句的执行路径的选择。
sysdistrib 表具有以下列。
表 15. SYSDISTRIB 表列描述

类型
解释
tabid
INTEGER
标识从中收集数据值的表的代码
colno
SMALLINT
源表中的列号
seqno
INTEGER
多个条目的顺序号码
constructed
DATETIME YEAR TO
FRACTION(5)
创建数据分发时的日期
mode
CHAR(1)
优化级别:M = 中 H = 高
resolution
SMALLFLOAT
在 UPDATE STATISTICS 语句中指定
confidence
SMALLFLOAT
在 UPDATE STATISTICS 语句中指定
encdat
STAT
统计信息
type
CHAR(1)
统计信息的类型:
A = encdat 在固定长度字符字段中具有
ASCII 编码的直方图

S = encdat 具有用户定义的统计信息

smplsize
SMALLFLOAT
大于 0 且不超过 1.0 的值表示 UPDATE
STATISTICS 对表中总行数采样的比例。
大于 1.0 的值表示 UPDATE STATISTICS
所采样的实际使用行数。值 0 表示未指
定采样大小。UPDATE STATISTICS HIGH
总是更新所有行的统计信息。
rowssampled
FLOAT
样本中的行数
constr_time
DATETIME YEAR TO
FRACTION(5)
记录分发的时间
ustnrows
FLOAT
计算分发时分段中的行。

GBase 8s SQL 指南:参考
南大通用数据技术股份有限公司 - 38 -

类型
解释
ustbuildduration
INTERVAL HOUR TO
FRACTION(5)
计算此列的分发统计信息所花费的时间
nupdates
FLOAT
表的更新数
ndeletes
FLOAT
表的删除数
ninserts
FLOAT
表的插入数

当以方式 MEDIUM 或 HIGH 对某张表执行 UPDATE STATISTICS 语句时,会将信息存
储在 sysdistrib 表中。(UPDATE STATISTICS LOW 不会将值插入到 mode 列中。)
只有用户 gbasedbt 才能选择 encdat 列。
sysdistrib 系统目录表中的每一行都使用 tabid 和 colno 列(为它们收集统计信息)
作为键。
对于内置数据类型的列,将类型字段设置为 A。encdat 列存储用 ASCII 编码的直方
图,此直方图分为多行,每行包含 256 个字节。
在 GBase 8s 中,对于用户定义的数据类型的列,type 字段设置为 S。encdat 列以
多重表示格式存储由 statcollect 用户定义的例程收集的统计信息。对每个 tabid 和 colno
对只存储一行。tabid、colno 和 seqno 列的组合索引只允许这些值的唯一组合。

以下三个 DML 计数器列会记录在生成列分发统计信息时对表执行修改数据行的 DML 操作
的计数:
nupdates 中的 UPDATE 操作数
ndeletes 中的 DELETE 操作数
和 ninserts 中的 INSERT 操作数
这些计数还可包括 MERGE 语句修改的行。
这些 DML 计数器列会存储在生成分发统计信息时存在的服务器分区中的计数器
值。如果 AUTO_STAT_MODE 配置参数、AUTO_STAT_MODE 会话环境设置或 UPDATE
STATISTICS 语句的 AUTO 关键字已启用数据分发统计信息的选择性更新,那么
ninserts、ndeletes 和 ninserts 值可影响 UPDATE STATISTICS 操作是否刷新现有数
据分发统计信息。当以 MEDIUM 或 HIGH 方式对表运行 UPDATE STATISTICS 语句时,
数据库服务器会比较这些列中的已存储值与分区中的当前值。如果已存储值之和不同于
分区页面中的这些当前 sysdistrib DML 计数器值之和,少于 STATCHANGE 表属性或
STATCHANGE 配置参数的设置所指定的阈值,那么不会更新表的列分发统计信息。