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

PostgreSQL知识分享-第35期

原创 多米爸比 2024-03-13
1073

本期分享如下:

  • 大小写不敏感的citext类型
  • 追踪服务端错误堆栈
  • 表与数组构造引用
  • function、procedure、routine

一、citext数据类型

一个迁移案例里Java程序提示找不到该扩展的控制文件,截图如下:

image.png

进一步发现应用框架使用了citext扩展插件,在服务端手工编译这个插件即可正常。

PG里使用citext插件可以创建citext数据类型,citext数据类型是一个不区分大小写的文本类型,允许在进行文本比较时忽略大小写,可以在进行文本比较时更加方便和快速。

据称这个扩展插件在各大云厂商的服务里是标配。

citext的详细介绍请参考官网:https://www.postgresql.org/docs/16/citext.html

二、追踪服务端错误堆栈

排查openGauss的一个业务问题时,了解可以通过服务端设置如下参数:

backtrace_min_messages='error'

该参数会打印函数的堆栈信息到服务器日志文件中,方便数据库研发人员准确定位分析问题。

借助该参数很快定位到引起业务异常的原因,在当前最新版本的PG里并没有这样一个友好的参数。

不过当前PG里有个类似的参数backtrace_functions,需要了解内部函数名称,然后配置到该参数里,然后PG可以获取调用的函数堆栈信息,通过查看日志可以详细分析。

好消息是在开发中的PG 17引入了backtrace_on_internal_error,大概是对其了上面这个功能,参考截图如下:

image.png

三、表与数组构造及元素引用

从Oracle迁移过来的table()函数,接收数组类型,参考SQL如下:

select * from table(array);

在PG里可以使用unnest函数替换

select unnest(array);

例如:先使用array + values列表或子查询来构建数组

postgres=# select array(values('one'), ('two') ); array ----------- {one,two} (1 row)

再使用unnest函数转换

postgres=# select unnest(array(values('one'), ('two') )); unnest -------- one two (2 rows)

对数组元素的引用,PG里还可以使用[N:M],尤其是使用[:M],取前M个元素;或者使用[N:],取后N个元素。

select (array_agg(pid))[:2] from pg_stat_activity; select (array_agg(pid))[2:] from pg_stat_activity;

这个小特性是从9.6版本开始支持。

四、function、procedure、routine

如下的授权语句在PG 11之前的版本执行时提示错误如下:

postgres=# grant execute on all routines in schema pg_catalog to admin; ERROR: syntax error at or near "routines" ...

从PG 11开始,才正式引入procedure存储过程,对函数及存储过程授权即可以分开

grant execute on all functions in schema pg_catalog to admin; grant execute on all procedures in schema pg_catalog to admin;

也可以使用routine包含:

grant execute on all routines in schema pg_catalog to admin;

routine的概念在PG里包含的范围其实更广,可参考如下描述:

image.png

关联推荐

如果有任何问题需要讨论交流的朋友,欢迎添加本人微信号skypkmoon。

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

评论