南大通用GBase8s 常用SQL语句(三十八)
南大通用GBase8s 常用SQL语句(三十八)
CREATE DEFAULT USER 语句(UNIX™、Linux™)
使用 CREATE DEFAULT USER 语句定义缺省的内部已经通过身份验证的用户的属性集。该语句是 SQL 语言 ANSI/ISO 标准的扩展。
语法
用法
CREATE DEFAULT USER 是 CREATE USER 语句的特例。在使用 CREATE DEFAULT USER 语句定义缺省用户属性之后,您可使用 CREATE USER 语句(但是省略 PROPERTIES 子句)创建具有缺省用户属性的新用户。
只有 DBSA 能发出 CREATE DEFAULT USER 语句。在非 root 安装中,安装服务器的用户等价于 DBSA,除非用户将 DBSA 权限委托给另一个用户。
在缺省用户(CREATE DEFAULT USER 语句创建)可以连接到数据库服务器之前,USERMAPPING 配置参数必须设置为启用支持映射用户的值(ADMIN 或 BASIC)。DBSA 可以发出 CREATE DEFAULT USER 语句给缺省用户映射关联的合适身份级别的属性。USERMAPPING 配置参数必须设置为 ADMIN 来启用缺省用户拥有服务器管理权限,通过 AUTHORIZATION 关键字,AAO 、BARGROUP 、DBSA 和 DBSSO 是指定的管理权限的关键字选项
您必须在 sysusers 数据库中的 SYSUSERMAP 表中输入值以映射用户具有适当的用户属性,以致于 SQL 语句映射的用户可以正确地工作。
您不能在 CREATE DEFAULT USER 语句中指定密码或锁定账户或解锁账户信息。该语句等价于 GRANT ACCESS TO PUBLIC PROPERTIES 语句。等价的语法
REVOKE ACCESS TO PUBLIC;
是:
DROP DEFAULT USER;
要内部更改缺省的已经通过身份验证的用户的属性,您可发出 ALTER DEFAULT USER WITH PROPERTIES 语句。
CREATE DEFAULT USER 语句的执行可带有 CRUR 审计码审计,也是 CREATE USER 语句相同的助记符。
有关 CREATE DEFAULT USER 语句的 PROPERTIES 选项的更多信息,请参阅 CREATE USER 语句(UNIX、Linux)。
CREATE DISTINCT TYPE 语句
使用 CREATE DISTINCT TYPE 语句创建新的 distinct 数据类型。
该语句是 SQL ANSI/ISO 标准的扩展。
语法
元素 描述 限制 语法
distinct_type 在这里为新的 distinct 数据类型声明的名称 在兼容 ANSI 的数据库中,所有者和数据类型的组合在数据库中必须是唯一的。在不兼容 ANSI 的数据库中,名称在数据库中的数据类型名称中必须是唯一的 数据类型
source_type 新类型所基于的现有类型名称 必须为内置数据类型或用 CREATE DISTINCT TYPE 、 CREATE OPAQUE TYPE 或 CREATE ROW TYPE 语句创建的类型 数据类型
用法
Distinct 类型是基于内置数据类型或现有不透明数据类型,指定的 ROW 数据类型或者其它 Distinct 数据类型的数据类型。Distinct 数据类型是强归类的。虽然 Distinct 类型与其源类型对数据有相同的物理表示法,但两种类型的值在没有从一种类型到另一种类型的显式强制转型的情况下无法进行比较。
要创建 Distinct 数据类型,您必须拥有数据库上的 Resource 权限。任何拥有 Resource 权限的用户均可从内置数据类型之一创建 Distinct 类型,而该用户是用户 gbasedbt 所拥有的。
重要: 不能在 SERIAL 、BIGSERIAL 或 SERIAL8 数据类型上创建 Distinct 类型。
要从不透明类型、指定的 ROW 类型或另一 Distinct 类型创建 Distinct 类型,您必须是该数据类型的所有者或在该数据类型上拥有 Usage 权限。
缺省情况下,一旦定义了 Distinct 类型,之一该 Distinct 类型的所有者和 DBA 可以使用它。然而,Distinct 类型的所有者可向其他用户授权对该 Distinct 类型的 Usage 权限。
Distinct 类型与其源类型有相同的存储结构。以下语句创建了基于内置 DATE 数据类型的 Distinct 类型 birthday:
CREATE DISTINCT TYPE birthday AS DATE;
虽然 GBase 8s 使用对 Distinct 类型以及它的源类型使用相同的存储格式,但 Distinct 类型与其源类型不能在一个操作中进行比较,除非一个类型显式强制转型到另一个类型。
如果您包含了 IF NOT EXISTS 关键字,当指定名称的 Distinct 数据类型已经在当前数据库中注册过时,则数据库服务器不采取任何操作(而不是向应用程序发送异常)。
对 Distinct 类型的权限
要创建 Distinct 类型,您必须拥有该数据库上的 Resource 权限。当创建 Distinct 类型时,只有您,即所有者对此类型拥有 Usage 权限。使用 GRANT 或 REVOKE 语句向其它数据库用户授权或调用 Usage 权限。
要找出特定类型上存在哪些特权,请在 sysxtdtypes 系统目录表中检查所有者名称,并在 sysxtdtypeauth 系统目录表中检查可能已经授予的其它数据类型特权。有关系统目录表的更多信息,请参阅 GBase 8s SQL 参考指南 。
DB-Access 实用程序也可显示对 Distinct 类型的特权。
支持函数和强制转型
当您创建 Distinct 类型时, GBase 8s 自动定义两种显式强制转型:
从 Distinct 类型到其源类型的强制转型
从源类型到 Distinct 类型的强制转型
因为这两个数据类型具有相同的表示法(相同的长度和对齐方式),所以实现这些强制转型不需要支持函数。
您可在 Distinct 类型与其源类型之间创建隐式强制转型。要创建隐式强制转型,请使用 Table Options 子句来指定外部数据的格式。然而,您必须首先删除 Distinct 类型与其源类型之间的缺省显式强制转型。
在源类型上定义的所有支持函数的强制转型可用于 Distinct 类型。然而,对 Distinct 类型定义的强制转型和支持函数对源类型不可用。请使用 Table Options 子句指定外部数据的格式。
操纵 Distinct 类型
当将 Distinct 类型与其源类型进行比较或操纵它们的数据时,在以下情况中您必须显式地将一种类型强制转型为其它类型:
使用其它类型的值插入或更改一种类型的列
使用关系运算符来加、减、乘、除、比较或以其它方式操纵两个值,一个源类型的值和一个 Distinct 类型的值
例如,假设您创建了 Distinct 类型 dist_type ,它基于 NUMERIC 数据类型。然后您创建了带有两列的表,一个属于 dist_type 类型,一个属于 NUMERIC 类型。
CREATE DISTINCT TYPE dist_type AS NUMERIC;
CREATE TABLE t(col1 dist_type, col2 NUMERIC);
要直接将 Distinct 类型与其源类型进行比较或者将源类型的值分配到 Distinct 类型的列上,您必须将一种类型强制转型到其它类型,如以下示例所示:
INSERT INTO tab (col1) VALUES (3.5::dist_type);
SELECT col1, col2
FROM t WHERE (col1::NUMERIC) > col2;
SELECT col1, col2, (col1 + col2::dist_type) sum_col
FROM tab;
有关在本地数据库外的表内存取 DISTINCT 数据类型的查询和其它分布 DML 操作的信息,请参阅 分布式操作中的 DISTINCT 类型 。