【openGauss】升级脚本撰写 半自动脚本生成语句

首先先上两篇官方的文档:

openGauss升级脚本撰写经验总结
openGauss升级脚本撰写

对于更加具体的操作,可以参考92_364这一个脚本,长度短好参考,目录:
src/include/catalog/upgrade_sql/upgrade_catalog_maindb/upgrade_catalog_maindb_92_364.sql

函数的升级脚本

官方在《openGauss升级脚本撰写经验总结》中给出了一种基于新库自动生成函数升级脚本的sql命令,
原理就是读新函数的定义,按照升级脚本的格式输出,这样就避免了手残填错参数的可能性。

-- 先创建这个table
create table addfuncs(name varchar(100)); 

-- 这里往table插入需要升级的函数的函数名
insert into addfuncs values('int32_b_format_date');

-- 这里相当于读取这些新函数的定义,按照升级脚本的格式输出
SELECT format(
'SET LOCAL inplace_upgrade_next_system_object_oids = IUO_PROC, %s;
CREATE OR REPLACE FUNCTION pg_catalog.%s (%s) RETURNS %s LANGUAGE INTERNAL %s %s as ''%s'';
%s',
 oid,
 proname,
 pg_catalog.pg_get_function_arguments(oid),
 pg_catalog.pg_get_function_result(oid),
 case when provolatile='i' then 'IMMUTABLE' when provolatile='s' then 'STABLE' when provolatile='v' then 'VOLATILE' END, 
 case when proisstrict = 't' then 'STRICT' else '' end, 
 prosrc,
 case when proisagg='t' or proiswindow='t' then '--ERROR: THIS FUNCTION ABOVE IS AN AGG OR WINDOW' end)
FROM pg_proc
WHERE proname in (select name from addfuncs);


-- 这个是回滚脚本用的
SELECT format(
'DROP FUNCTION IF EXISTS pg_catalog.%s (%s);',
 proname,
 pg_catalog.pg_get_function_arguments(oid))
FROM pg_proc
WHERE proname in (select name from addfuncs);

有一个发现,好像和新建类型相关的函数是不用手动drop的,drop类型时可能就自动drop掉了。

类型的升级脚本

与上面自动生成函数升级脚本原理相同,我自己又写了一个类型的升级命令,不过这个功能十分简陋,还要手动把in,out放进去,
姑且算是半自动吧(逃

create table addtypes(name varchar(100)); 


insert into addtypes values('year');


SELECT format(
'SET LOCAL inplace_upgrade_next_system_object_oids = IUO_TYPE, %s, %s, %s;
CREATE TYPE pg_catalog.%s;


CREATE TYPE pg_catalog.%s (input=%s_in, output=%s_in, internallength=%s, passedbyvalue, alignment=%s);

',
 oid,
 typarray,
 typtype,

 typname,

 typname,
 typname,
 typname,
 typlen,
 case when typalign='c' then 'char' when typalign='s' then 'short' when typalign='i' then 'int' when typalign='d' then 'double' end
 )
FROM pg_type
WHERE typname in (select name from addtypes);

回退的时候记得把数组类型给回退回去,以year类型为例,回退是这样的:

DROP TYPE IF EXISTS pg_catalog.year CASCADE;
DROP TYPE IF EXISTS pg_catalog._year CASCADE;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值