暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

AntDB 使用教程 / Oracle兼容 / SQL命令8

tocata 2024-08-19
46

CREATE ROLE

名称

CREATE ROLE —— 定义一个新的数据库角色。

概要

CREATE ROLE name

描述

CREATE ROLE 命令用于在 AntDB 集群中添加一个新的角色。角色是一个实体,能够拥有数据库对象和数据库权限。可以把一个角色认为是一个用户,一个组或者根据用途来决定角色的性质。新创建的角色没有 LOGIN 权限,所以它不能启动一个会话。可以使用 ALTER ROLE 命令来为角色授予 LOGIN 权限。拥有 CREATEROLE 权限的用户或者超级用户才能使用 CREATE ROLE 命令。

需要注意的是,角色是在数据库集群层面内定义的,所以新创建的角色对所有集群内数据库有效。

参数

name

新创建角色的名称。

示例

创建一个角色,名称是 admins。

CREATE ROLE admins;

CREATE SEQUENCE

名称

CREATE SEQUENCE —— 定义一个新的序列生成器。

概要

CREATE SEQUENCE name [ INCREMENT BY increment ]

[ { NOMINVALUE | MINVALUE minvalue } ]

[ { NOMAXVALUE | MAXVALUE maxvalue } ]

[ START WITH start ] [ CACHE cache | NOCACHE ] [ CYCLE | NOCYCLE ]

描述

CREATE SEQUENCE 命令用于创建一个新的序列数字生成器。这个操作涉及到创建和初始化一个名称为参数 name 所指定,带有单条记录的表。运行这条命令的用户是新创建序列生成器的所有者。

如果指定了模式名称,那么序列在指定模式中创建,否则就在当前模式中创建。在同一模式中,序列的名称不能与其他的序列、表、索引或者视图相同。

序列创建完成后,使用函数 NEXTVAL 和 CURRVAL 对序列进行操作。这些函数的用法在章节 2.5.6 部分有详细说明。

参数

name

创建的序列的名称(可以采用模式限定的方式引用)。

increment

可以使用可选的 INCREMENT BY increment 子句把当前序列的值加上指定增量值,这样可以产生一个新的数值。一个正数增量将会产生一个升序序列,一个负数增量产生一个降序序列值。这个参数的缺省值是 1。

NOMINVALUE | MINVALUE minvalue

可选子句 MINVALUE minvalue 决定一个序列可以产生的最小值。如果没有使用这个子句,将使用缺省值。升序的缺省值是 1,降序的缺省值是 -2 ^ 63。需要注意的是可以使用关键字 NOMINVALUE 把序列可产生的最小值设定回缺省值。

NOMAXVALUE | MAXVALUE maxvalue

可选子句 MAXVALUE maxvalue 决定一个序列可以产生的最大值。如果没有使用这个子句,将使用缺省值。升序的缺省值是 2 ^ 63 -1,降序的缺省值是 -1。需要注意的是可以使用关键字 NOMAXVALUE 把序列可产生的最大值设定回缺省值。

start

可选子句 START WITH start 允许序列从任意一个位置开始。对于升序序列来说,缺省值是 minvalue,对于降序序列来说缺省值是 maxvalue。指定的start值必须大于等于 minvalue。

cache

可选子句 CACHE cache 指定了为快速访问,有多少序列数预先分配,并存储在内存中。这个参数的最小值是 1(每次只产生一个值,例如, NOCHACHE), 并且这也是缺省值。

CYCLE | NOCYCLE

当升序序列和降序序列达到各自的最大值和最小值,CYCLE 选项允许序列返回到初始位置。如果达到了限制值,那么下一次产生的数值就是各自的最小值和最大值。

如果使用 NOCYCLE 或者不写(默认是 NOCYCLE),当序列达到最大值的时候,任何对 NEXTVAL 的调用将返回一个错误。

注意

序列基于大整数算法,所以数值不能超过 8 字节长度的整数(从 -9223372036854775808 到 9223372036854775807)。在一些版本比较老的平台,可能没有编译器支持 8 字节长度的整数,在这种情况下,序列只能使用规则整数算法(范围是从 -2147483648 to +2147483647)。

当多个会话并发访问一个缓存设置大于 1 的序列对象的时候,可能会取得不希望的结果。这是因为每一个会话在访问序列对象的过程中都要分配和缓存连续的序列值,因此都要增加序列对象的最新值。然后,会话中接下来 cache-1 次 NEXTVAL 函数的调用仅仅返回预先分配的值,而没有实际与序列对象联系。这样,当会话结束的时候,任何已分配但是没有在会话中使用的值将会丢失。这样就会在序列中产生一个漏洞。

此外,尽管可以保证对多个会话分配各自不同的序列值,但是当考虑到所有会话的时候,产生的相关数值还是会超出序列范围。例如,当缓存设置为 10 的时候,会话 A 可以保留数值 1..10 并且返回 NEXTVAL=1,然后会话 B 可能保留数值11..20,然后在会话 A 产生 NEXTVAL=2 的前面返回 NEXTVAL=11。因此把缓存设置设定为 1 是安全的,能够保证 NEXTVAL 值顺序产生:缓存设置大于 1 的时候,只能保证 NEXTVAL 值都是不同的,不能保证他们是顺序产生的。而且最后的值只是反映了任意一个会话所保留的值,无论它是不是已经通过 NEXTVAL 返回。

示例

创建一个名称为 serial 的升序序列,从 101 开始:

CREATE SEQUENCE serial START WITH 101; 

从这个序列中选择下一个数值:

SELECT serial.NEXTVAL FROM DUAL;

SERIAL.NEXTVAL  
-----------------
             101
(1 row)

创建一个名称为 supplier_seq 的序列,使用 NOCACHE 选项:

CREATE SEQUENCE supplier_seq
MINVALUE 1
START WITH 1
INCREMENT BY 1
NOCACHE;

从这个序列中选择下一个值:

SELECT supplier_seq.NEXTVAL FROM DUAL;

SUPPLIER_SEQ.NEXTVAL  
---------------------------------------
                     1
(1 row)



「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论