返回首页

gbase数据、南大通用产品文档:GBase8s所有者名称

更新日期:2024年09月11日

所有者名称指定数据库对象的所有者。当您在语法图表中引用所有者名称时使用
本段。
语法
所有者名称

元素
描述
限制
语法
owner 数据库中对象所有者的
用户名
最大长度为 32 个
字节
必须遵守操作系统的规
则。
用法
在兼容 ANSI 的数据库中,必须指定您不拥有的数据库对象的所有者。在对数据
库对象的引用中,所有者名称的 ANSI/ISO 同义词时授权标识符。(然而,在对
模式对象的引用中, GBase 8s 文档调用的所有者名称的 ANSI/ISO 术语是模式
名称。)
在不兼容 ANSI 的数据库中,所有者名称是可选的。当创建数据库对象或用户数
据范围语句时,您不需要指定所有者。如果在创建数据库对象时不指定所有者,
那么在大多数情况下,数据库服务器将您的登录名指定为对象的所有者。 有关此
规则的例外,请参阅 CREATE FUNCTION 语句描述中的已创建数据库对象的所
有权和 CREATE PROCEDURE 语句描述中的创建数据库对象的所有权。当在所
有者特权 UDR 中的 DDL 语句创建一个新的数据库对象时,例程的所有者(而
非执行它的用户,如果此用户不是例程的所有者)成为新数据库对象的所有者。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1649
如果您在数据访问语句中指定所有者,那么数据服务器会检查它的正确性,不加
引号时,所有者是不区分大小写的。下面的四个查询都可以访问表 kaths.tab1
的数据:
SELECT * FROM tab1;
SELECT * FROM kaths.tab1;
SELECT * FROM KATHS.tab1;
SELECT * FROM Kaths.tab1;
在兼容 ANSI 的数据库中,只有表的所有者,用户 kaths,可以发出第一个示例
中的查询,其指定了一个未限定的表名,但是持有 tab1 上的 Select 特权的任何
用户可以在不兼容 ANSI 的数据库中发出该查询。有关在兼容 ANSI 数据库中所
有者名称的更多信息,请参阅符合 ANSI 的数据库的限制和区分大小写。
CREATE ROLE 语句声明的角色是授权标识符,因而会收到所有者名称的语法限
制,但是角色不能是数据库对象的所有者。同样,关键字 PUBLIC,它指定所有
用户的群组,不能是数据库对象的所有者,除了在特殊的 sysdbopen( ) 和
sysdbclose( ) 过程的情况中。有关这些内置会话配置 UDR 的更多信息,请参阅
会话配置过程。
使用引号
当使用引号时,所有者是区分大小写的。换句话说,引号指示数据库服务器在您
创建或访问数据库对象时,确切地按照输入读取或存储名称。例如,假设有一个
表,它的所有者是 Sam。可以使用下面两个语句中的任何一个来访问表中的数
据:
SELECT * FROM table1;
SELECT * FROM 'Sam'.table1;
第一个查询成功,因为不需要所有者名称。第二个查询成功,因为指定的所有者
名称和存储在数据库中的所有者名称匹配。
引用 gbasedbt 用户拥有的表
如果使用所有者名称作为从一个系统目录表访问数据库对象信息的选择条件,则
所有者名称是区分大小写的。要保留字母大小写,必须将所有者用单引号或双引
号括起来,并且必须完全按照其存储在系统目录表中的方式键入所有者名称。在
以下两个示例中,只有第二个成功访问表 Kaths.table1 上的信息。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1650
SELECT * FROM systables WHERE tabname = 'tab1' AND owner = 'kaths';
SELECT * FROM systables WHERE tabname = 'tab1' AND owner = 'Kaths';
用户 gbasedbt 是系统目录表的所有者。并且当 SQL 语句引用系统目录时,在
兼容 ANSI 的数据库中必须指定 gbasedbt 作为限定符,除非您是用户
gbasedbt:
SELECT * FROM "gbasedbt".systables WHERE tabname = 'tab1' AND owner =
'Kaths';
GBase 8s 接受以下任何符号,以指定符合 ANSI 的数据库的系统目录表:

"gbasedbt".system_table

gbasedbt.system_table

'gbasedbt'.system_table
然而,在这三种格式中,只有第一种,其中所有者被指定为定界标识符,可以与
大多数其它数据库服务器直接交互。对于不带分隔符的格式,SQL 的 ANSI/ISO
标准将小写字母升级为 GBASEDBT,同一标准不支持单引号(')作为所有者名称或
模式名称的有效分隔符。
相反, GBase 8s 将 gbasedbt 的名称视为一种特殊情况,并且在指定 gbasedbt
时保留小写字母,带或不带分隔符,无论数据库是否符合 ANSI。但是,要编写
可移植到非 GBase 8s 数据库服务器的 SQL 代码,应始终使用双引号(" )将
数据库对象的所有者名称分隔开。
以下 SQL 示例使用未定界的所有者名称:
CREATE TABLE gbasedbt.t1(i SERIAL NOT NULL);
CREATE TABLE someone.t1(i SERIAL NOT NULL);
如果这些语句成功执行,第一个表将在 systables 中注册的 gbasedbt 作为所有
者,第二个表将 SOMEONE 注册为所有者。当所有者的指定字母大小写,但所有
者名称未限定时,字母大小写无关紧要,因为 GBase 8s 将未分隔的所有者名称
变成大写,但将未定界的 gbasedbt (或 GBASEDBT)所有者名称变为小写的
gbasedbt。
例如,假设之前两个 CREATE TABLE 语句成功执行后,用户 gbasedbt 发出下
列语句:
CREATE TABLE GBASEDBT.t1(i SERIAL NOT NULL);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1651
该语句失败,因为所有者名称和表名称的组合不是唯一的,如果之前注册的
gbasedbt 用户拥有的表已经在数据库中存在。
提示: USER 操作符返回当前用户在系统上存储的登录名。如果所有者名称与登
录名不同(例如,混合大小写所有者名称和全小写登录名),则 owner = USER
语法失败。
符合 ANSI 的数据库的限制和区分大小写
下表描述了当您创建、重命名或访问数据库对象时数据库服务器如何读取和存储
所有者。
所有者名称规范
兼容 ANSI 的数据库的做法
忽略
严格按照登录名存储在系统中的方式读取或存储所有者,但
如果用户不是所有者,则会返回错误。
不带引号指定
以大写字母读取或存储所有者
包括在引号中
完全按照输入读取或存储所有者 。另见使用引号和引用
gbasedbt 用户拥有的表。
如果在兼容 ANSI 的数据库中创建或重命名数据库对象时指定所有者名称,必须
在数据访问语句中包含所有者名称。当访问不属于您的数据库对象时您必须包含
所有者名称。
因为如果所有者不在引号之间,则数据库服务器自动将所有者转换为大写字母,
区分大小写错误会导致查询失败。例如,如果您是用户 nancy 并且使用以下语
句,则产生的视图具有名称 nancy.njcust:
CREATE VIEW 'nancy'.njcust AS
SELECT fname, lname FROM customer WHERE state = 'NJ';
以下 SELECT 语句失败,因为它试图将 NANCY.njcust 和实际所有者和表名
nancy.njcust 相匹配:
SELECT * FROM nancy.njcust;
在 GBase 8s 分布式查询中,如果所有者名称不在引号中,则远程数据库遵循本
地数据库的大小写约定。如果本地数据库是兼容 ANSI 的,则远程数据库将所有
者名称处理为 uppercase。如果本地数据库是不兼容 ANSI 的,则远程数据库将
所有者名称处理为 lowercase。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1652
提示: 使用所有者名称作为查询中的选择标准之一(例如,WHERE owner =
'kaths')时,必须确保带引号字符串和存储在数据库中的所有者名称完全匹配。
如果数据库服务器找不到数据库对象或数据库,可能需要修改查询使引用字符串
使用大写字母(例如,WHERE owner = 'KATHS')。
因为所有者名称是授权标识符,而不是 SQL 标识符,因此可以在数据库的 SQL
语句中的单引号(')之间包含所有者,其中 DELIMIDENT 环境变量指定支持分
隔标识符,从而需要双引号(")围绕 SQL 标识符。
为兼容 ANSI 的数据库设置 ANSIOWNER
兼容 ANSI 的数据库的缺省行为是将在任何 owner 规范中的所有不在引号中的
小写字母替换为大写字母。可以通过在数据库服务器初始化之前设置
ANSIOWNER 环境变量为 1 ,来阻止这个行为。这将保持您在不加引号指定
owner 字符串时所使用的任意大小写形式。
缺省所有者名称
如果您在不符合 ANSI 的数据库中创建数据库对象时未显式地指定所有者名称,
则您的授权标识符(作为对象的缺省所有者)将存储到数据库的系统目录中,如
同您已经加上引号指定您的授权标识(即,保持大小写形式)。
如果您在符合 ANSI 的数据库中创建建数据库对象时未显式地指定所有者名称,
则您的授权标识符(作为对象的缺省所有者)将以大写字符存储到数据库的系统
目录中,除非 ANSIOWNER 环境变量在数据库服务器初始化之前已设置为
1 。但如果 ANSIOWNER 已设置为 1 ,则数据库服务器将存储对象的缺省所
有者作为您的授权标识符,保持其大小写形式。
所有者名称的大小写形式规则总结
要创建数据库对象,例如名为 mytab 的表,登录名为 Otho 的用户可以以下列几
种方式声明新数据库对象的名称:
1. CREATE TABLE mytab . . .
2. CREATE TABLE Otho.mytab . . .
3. CREATE TABLE "Otho".mytab . . .

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1653
未分隔的所有者名称(第二个示例中)存储在 systables 系统目录表的 owner
列的形式取决于本地数据库是否符合 ANSI 。

在情况 1 中,未指定所有者名称。表的隐式所有者是 Otho,创建该表的
用户,并且所有者名称以与所有者的用户标识相同的格式(Otho)存储在
systables 表中,与数据库的 ANSI 兼容状态无关。

在情况 2 中,指定未定界的所有者名称。systables 表对于不符合 ANSI
的数据库的数据库,将所有所有者名称字母存储为小写(此处为
otho)。对于兼容 ANSI 的数据库(其中不将 ANSIOWNER 设置为
1), systables 表将所有所有者名称字母存储为大写(此处为
OTHO)。但是,如果 ANSIOWNER 设置为 1,则名称以与 DDL 语
句中指定的相同大小写形式存储(此处为 Otho)。

在情况 3 中,定界的所有者名称按照其指定的相同的形式(此处为
Otho)存储在 systables 表中,与数据库的 ANSI 兼容状态无关。
请注意用户标识符是区分大小写的,但是数据库名称不区分大小写。因此,同一
个用户不能用于表 tab 和表 TAB 。
除了这些示例中的 CREATE TABLE 语句之外,所有 SQL 语句和 SPL 语句都
遵循这些规则。例如,使用 DROP TABLE 时,在处理语句时所有者名称出现的
格式取决于以下相同的条件:

是否指定了显式所有者名称。

如果指定了显式所有者名称,是否使用引号将所有者名称分隔开。

如果没有使用引号将显式所有者名称分隔开,则数据库是否符合 ANSI 标
准。

如果数据库是符合 ANSI 的,则在数据库初始化之前是否将
ANSIOWNER 设置为 1。

动态地停止监听线程
(SQL
管理 API)
随同 admin() 或 task() 函数,使用 stop listen 参数来为 SOCTCP 或 TLITCP 网络协
议停止现有的监听线程,而不中断现有的连接。
语法

元素
描述
关键考虑
server_name
你想要为其停止监听线程的那
个数据库服务器的名称。


用法
在 sqlhosts 文件中必须存在监听线程的定义。
这个函数不更新 sqlhosts 文件。
这个函数等同于 onmode -P stop server_name 命令。
示例
下列命令为名为 ids_serv3 的服务器停止监听线程:
EXECUTE FUNCTION task("stop listen","ids_serv3");

_t_gcluster_use_new_dual
参数_t_gcluster_use_new_dual,控制gcluster 是否使用dual 表的新的实现方式,新
的实现方式支持insert into ... select ... from dual 等功能。
取值范围:0、1;
默认值0;
0: 使用旧的实现方式,不支持insert into ... select ... from dual 等功能;
1:使用新的实现方式,支持insert into
... select ... from dual 等功能;
作用域:session,global。