identity_pwdexp是KingbaseES的一个扩展插件,用于设置口令有效期。
KingbaseES的用户管理中含有口令有效期这一属性,用户密码过期检查就是通过设置用户密码的有效期,在用户密码过期后限制用户登录数据库,并输入新密码的功能。
KingbaseES通过插件的方式来进行用户密码过期检查。这种方式更为灵活,当数据库的实用场景需要进行用户密码过期检查时,加载插件即可。而不需要该功能时,卸载插件即可。
KingbaseES中通过 1 个全局级参数配合插件来实现用户密码过期检查。
插件名为 identity_pwdexp
插件版本 V1.0
在使用 identity_pwdexp 之前,需要将他添加到 kingbase.conf 文件的 shared_preload_libraries 中,并重启 KingbaseES 数据库。
shared_preload_libraries = 'identity_pwdexp' # (change requires restart)
identity_pwdexp.password_change_interval
密码有效期,单位是天,取值范围为[1,INT_MAX],缺省为 30。
参数只能在postmaster启动或由安全管理员通过SQL语言(alter命令)进行设置。
语句Alter system set 参数名 = 参数值;
修改后再运行select sys_reload_conf();不用重启服务器,对所有数据库及连接立即生效。
指定密码创建用户时,可通过 valid until 选项指定该用户的密码有效期,指定的密码有效期必须晚于当前时间且早于更换周期。
identity_pwdexp.password_change_interval指定的时间。对已创建成功且已拥有密码的用户,也可通过alter语句的 valid until 选项修改其密码有效期,但仅安全管理员有这个权限,其它用户无法修改自己及他人的口令更换周期。
若在创建用户或修改用户密码时未显示的通过 valid until 选项指定该用户的密码有效期,那么系统会根据
identity_pwdexp.password_change_interval参数设定的值自动为其计算密码有效期。
identity_pwdexp.max_password_change_interval
最大密码有效期,单位是天,取值范围为[1,INT_MAX],缺省为30。
参数只能在postmaster启动或由安全管理员通过SQL语言(alter命令)进行设置。
此参数用于限制密码有效期的设置范围,当设置的密码有效期大于最大密码有效期时,系统会报错提示。
-- 创建扩展
\c test system
create extension identity_pwdexp;
CREATE EXTENSION
-- 设置密码有效期是5天
\c test sso
show identity_pwdexp.password_change_interval;
identity_pwdexp.password_change_interval
------------------------------------------
30
(1 row)
alter system set identity_pwdexp.password_change_interval = 5;
ALTER SYSTEM
show identity_pwdexp.password_change_interval;
identity_pwdexp.password_change_interval
------------------------------------------
30
(1 行记录)
select sys_reload_conf();
sys_reload_conf
-----------------
t
(1 行记录)
show identity_pwdexp.password_change_interval;
identity_pwdexp.password_change_interval
------------------------------------------
5
(1 行记录)
\c test system
call now();
now
-------------------------------
2020-04-30 15:34:30.408304+08
(1 行记录)
CREATE USER u_pwd_et PASSWORD '1234567890abC/.' VALID UNTIL '2020-05-01';
CREATE ROLE
SELECT USENAME, VALUNTIL FROM SYS_USER WHERE USENAME = 'u_pwd_et';
usename | valuntil
----------+------------------------
u_pwd_et | 2020-05-01 00:00:00+08
(1 行记录)
ALTER USER u_pwd_et PASSWORD '/.1234567890abC';
警告: user "u_pwd_et" does not be locked
ALTER ROLE
SELECT USENAME, VALUNTIL FROM SYS_USER WHERE USENAME = 'u_pwd_et';
usename | valuntil
----------+-------------------------------
u_pwd_et | 2020-05-05 15:35:23.448381+08
(1 行记录)
具体参考《 KingbaseES安全指南 》 3.2.2.4 口令有效期设置章节。
修改 kingbase.conf 文件中 shared_preload_libraries 参数后重启数据库。
shared_preload_libraries = ''
identity_pwdexp扩展插件通常随着KingbaseES安装包一并升级。通常情况下用户无须单独升级这些插件。
intagg模块提供了一个整数聚合器和一个枚举器,作为内置函数的兼容性封装器提供。
插件名为intagg
插件版本 V1.0
使用时需要create extension intagg。
示例:
create extension intagg;
无需配置任何参数
聚合器是一个生产正好包含输入的整数的整数数组的聚合函数int_array_agg(integer)。这是array_agg的封装器,array_agg对于任意数组类型做相同的事情。
枚举器是返回setof integer类型的函数int_array_enum(integer[])。本质上是聚合器的反向操作:给出一个整数数组,将其展开为一组行。这是unnest的封装器,unnest对于任意数组类型做相同的事情。
示例:
许多数据库系统有一到多个表的概念。这样的一个表通常位于两个索引表之间
例如:
CREATE TABLE left_table(id INT PRIMARY KEY, ...); CREATE TABLE right_table(id INT PRIMARY KEY, ...); CREATE TABLE one_to_many(l INT REFERENCES left_table, r INT REFERENCES right_table);
通常这样使用:
SELECT right_table.* from right_table JOIN one_to_many ON (right_table.id = one_to_many.r) WHERE one_to_many.l = item;
这将返回所有在左手边的表里有记录的右手边表里的条目。这在SQL中是一个非常普通的构造。现在,这个方法在一个有非常大数量的记录的one_to_many表里是很难处理的。通常,像这样的连接将会导致索引扫描和抓取表中有左手边记录的每个右手边的记录。
如果你有一个非常动态的系统,那么没有什么你可以做的。不过,如果你有一些静态数据,你可以使用该聚合器创建一个汇总表。
CREATE TABLE summary AS SELECT l, int_array_aggregate(r) AS right_num FROM one_to_many GROUP BY l;
这将创建一个表,这个表有每个左边的条目和一个左边条目的数组。现在,如果没有使用该数组的方法则是相当无用的;这就是为什么有一个数组枚举器。你可以:
SELECT l,int_array_enum(r) FROM summary WHERE l = item;
上面的查询使用int_array_enum产生下面相同的结果:
SELECT l , r FROM one_to_many WHERE l = item;
不同之处是针对summary表的查询必须只从表中获取一行,而针对one_to_many的直接查询必须索引扫描然后从每条记录中获取一行。
在一个系统上,一个显示了消耗8488的查询的EXPLAIN减少到消耗329.原始查询时一个包括one_to_many表的连接,替换为:
SELECT r, count(r) FROM
( SELECT l, int_array_enum(r) AS right_num
FROM summary JOIN (SELECT l FROM left_table WHERE left_table.id = item) AS lefts
ON (summary.l = lefts.l ) AS list
GROUP BY r
ORDER BY count DESC;
不需要intagg插件只需要卸载插件即可。
示例:
drop extension intagg;
intagg扩展插件通常随KingbaseES安装包一并升级。通常情况下用户无法单独升级插件。
intarray模块为操作整数的null-free数组提供一些有用的函数和操作符。也支持使用其中的一些操作符执行索引搜索。 如果提供的数组包含任何空元素,那么所有这些操作符都将抛出一个错误。 这些操作符中的一些只对一维数组敏感。尽管他们将接受多个维数的输入数组,数组将按照存储的顺序当做一维数组。
插件名为intarray
插件版本 V1.0
使用时需要create extension intarray。
示例:
create extension intarray;
无需配置任何参数。
计算数组中元素的个数
语法
icount(_int4) RETURNS int;
示例
TEST=# select icount('{1,2,3}'::int[]);
icount
--------
3
(1 行记录)
对int数组进行排序。
语法
sort(int[]) returns int[]; sort(int[], text dir) returns int[];
参数
dir
如果dir是asc,则对数组进行升序排序。如果dir是desc,则对数组进行降序排序。
示例
TEST=# select sort('{2,1,5,7,3}');
sort
-------------
{1,2,3,5,7}
(1 行记录)
TEST=# select sort('{2,1,5,7,3}', 'asc');
sort
-------------
{1,2,3,5,7}
(1 行记录)
TEST=# select sort('{2,1,5,7,3}', 'desc');
sort
-------------
{7,5,3,2,1}
(1 行记录)
以升序的方式对数组进行排序。
语法
sort_asc(int[]) returns int[];
示例
TEST=# select sort_asc('{2,1,5,7,3}');
sort_asc
-------------
{1,2,3,5,7}
(1 行记录)
以降序的方式对int数组进行排序。
语法
sort_desc(int[]) returns int[];
示例
TEST=# select sort_desc('{2,1,5,7,3}');
sort_desc
-------------
{7,5,3,2,1}
(1 行记录)
消除相邻的相同的元素。
语法
uniq(int[]) returns int[];
示例
TEST=# select uniq('{2,1,5,7,7,7,3}');
uniq
-------------
{2,1,5,7,3}
(1 行记录)
匹配item的第一个元素中的索引(如果没有则为0)。
语法
idx(int[], int item) returns int;
参数
item
需要匹配的值。
示例
TEST=# select idx(array[1,23,5,2,5,2], 2); idx ----- 4 (1 行记录)
在start位置开始的,len个元素的数组的一部分。
语法
subarray(int[], int start) returns int[]; subarray(int[], int start, int len) returns int[];
参数
start
开始的位置。
len
指定子数组的长度。
示例
TEST=# select subarray('{1,2,3,2,1}'::int[], 2, 3);
subarray
----------
{2,3,2}
(1 行记录)
制作单个元素的数组。
语法
intset(int) returns int[];
示例
TEST=# select intset(42);
intset
--------
{42}
(1 行记录)
&& @> @< # + - | & @@
不需要intarray插件只需要卸载插件即可。
示例
drop extension intarray;
intarray扩展插件通常随KingbaseES安装包一并升级。通常情况下用户无法单独升级插件。
插件isn为下列国际产品编号标准提供数据类型EAN13、UPC、ISBN(图书)、ISMN(音乐)以及ISSN(期刊)。
在输入时会按照一个硬编码的前缀列表对输入进行验证,这个前缀的列表也被用来在输出时连接号码。
因为新的前缀总是不时地出现,这个前缀列表可能会过时。
这个模块的一个未来版本有希望得到一个来自于一个或多个表的前缀列表,这样用户可以根据需要来方便地更新前缀列表。
不过,在当前该列表只能通过修改源代码并且重新编译来更新。
另外一种方案是,这个模块的未来版本中可能会直接移除前缀验证和连接支持。
插件名为 isn
插件版本 V1.2
使用时需要在命令行执行create extension isn;
无需配置任何参数
加载插件isn后,按照如下方式使用相应功能。
如下表所示:
| 数据类型 | 描述 |
|---|---|
| EAN13 | 欧洲文章号,总是以EAN13格式显示 |
| ISBN13 | 国际标准图书号,以新的EAN13格式显示 |
| ISMN13 | 国际标准音乐号,以新的EAN13格式显示 |
| ISSN13 | 国际标准期刊号,以新的EAN13格式显示 |
| ISBN | 国际标准图书号,以旧的短格式显示 |
| ISMN | 国际标准音乐号,以旧的短格式显示 |
| ISSN | 国际标准期刊号,以旧的短格式显示 |
| UPC | 通用产品代码 |
isn模块提供了下列类型之间的造型:
ISBN13 <=> EAN13 ISMN13 <=> EAN13 ISSN13 <=> EAN13 ISBN <=> EAN13 ISMN <=> EAN13 UPC <=> EAN13 ISBN <=> ISBN13 ISMN <=> ISMN13 ISSN <=> ISSN13
当从EAN13造型为另一种类型时,会有对该值是否在另一种类型的域中的运行时检查,如果不在则抛出一个错误。其他的造型则是简单地重新贴个标签,因而总是会成功。
函数如下表所示:
| 函数 | 描述 |
|---|---|
| 述is_weak(boolean) return boolean | 设置弱输入模式(返回新设置)。 |
| isn_weak() return boolean | 得到弱模式的当前状态。 |
| make_valid(isn) return isn | 验证一个非法号码(清除非法标志)。 |
| is_valid(isn) return boolean | 检查非法标志的存在。 |
弱模式被用来允许插入非法数据到一个表中。非法意味着校验位错误,而不是有丢失号码。
为什么你会想要使用弱模式?你可能有一个巨大的ISBN号码集合并且出于某种奇怪的原因其中具有错误的校验位。
当你使用弱模式在一个表中插入非法号码时,被插入的号码将会被加上修正过的校验位,但是它的最后将会有一个'!'。例如0-11-000322-5!。这种非法标志符可以用is_valid函数检查并且可以用make_valid函数清除。
即使不在弱模式中,你也能通过在号码某位追加!字符来强制非法号码的插入。
另一个特殊特性是输入过程中,你可以写一个?代替校验位,然后正确的校验位将被自动插入。
--直接使用类型
select isbn('978-0-393-04002-9');
select isbn13('0901690546');
select issn('1436-4522');
--转换类型
select upc(ean13('022-035648348-1'));
select ean13(upc('220356483481'));
--创建一个表,它有一个单一列来保存ISBN号码
create table test(id isbn);
INSERT INTO test VALUES('9780393040029');
--自动计算校验位
INSERT INTO test VALUES('220500896?');
INSERT INTO test VALUES('978055215372?');
select issn('3251231?');
select ismn('979047213542?');
--使用弱模式
SELECT isn_weak(true);
INSERT INTO test VALUES('978-0-11-000533-4');
insert into test values('2-205-00876-X');
select isn_weak(false);
select id from test where not is_valid(id);
update test set id = make_valid(id) where id = '2-205-00876-X!';
select * from test;
select isbn13(id) from test;
不需要使用插件时执行指令drop extension isn即可。
isn扩展插件通常随KingbaseES安装包一并升级。通常情况下用户无须单独升级些插件。