postgresql 分表规则实时修改

postgresql 分表规则实时修改,第1张

概述postgresql数据库支持数据库分表,但是有时会遇到,现场的数据库已经在跑了,但是新的需求,需要增加一个字段, 字段增加,分表会自动增加的,但是规则不会实时更新,规则不更新的话,分表新的字段的值就不会更新掉。 其实只需要把所有的规则修改下就可以了,但是有时规则比较多,手动修改还是有点麻烦,所以,就写了一个函数来 做这个功能,这个使用起来还是很快很方便的,这里使用到的就是游标、函数 ------
postgresql数据库支持数据库分表,但是有时会遇到,现场的数据库已经在跑了,但是新的需求,需要增加一个字段,
字段增加,分表会自动增加的,但是规则不会实时更新,规则不更新的话,分表新的字段的值就不会更新掉。
其实只需要把所有的规则修改下就可以了,但是有时规则比较多,手动修改还是有点麻烦,所以,就写了一个函数来
做这个功能,这个使用起来还是很快很方便的,这里使用到的就是游标、函数
-------------该函数只需要主表名称和时间字段,即可针对主表字段有增加、修改、删除的情况时,一键修改规则----------------------------------------------------------定制项目有时会遇到有分表需要增加字段的情况,但是现场不会重新安装,但是----------------------------------------------------------------createor replace function cursor_demo (	tabname character varying,timefIEld character varying) returns refcursor as $body$ declare	sub_tab_name varchar (1000) ; column_name_desc varchar (1000) ; declare		fetch_sub_tab_refcursor cursor for select			tablename		from			pg_tables		where			tablename like tabname || '_%' ; declare				fetch_sub_column_refcursor cursor for select					column_name				from					information_schema. columns				where					table_name = tabname ; declare						sql_desc varchar (1000) ; declare							value_desc varchar (1000) ; declare								all_sql_desc varchar (2000) ; declare									st_time varchar (100) ;								begin									open fetch_sub_tab_refcursor ; loop fetch fetch_sub_tab_refcursor into sub_tab_name ;								if found then								if (									length (tabname) = (length(sub_tab_name) - 7)								) then								if (									tabname = (										substring (											sub_tab_name											from												1 for length (tabname)										)									)								) then									st_time := substring (										sub_tab_name										from											length (tabname) + 2 for length (sub_tab_name)									) ; st_time := substring (st_time from 1 for 4) || '-' || substring (st_time from 5 for 6) ; sql_desc := 'create or replace rule insert_' || sub_tab_name || ' as on insert to ' || tabname || ' where new.' || timefIEld || ' >= ''' || substring (										to_char(											to_timestamp(st_time,'yyyy-mm-dd'),'yyyy-mm-dd'										)										from											1 for 10									) || '''::date and new.' || timefIEld || ' <''' || substring (										to_char(											to_timestamp(st_time,'yyyy-mm-dd') + interval '1 month','yyyy-mm-dd'										)										from											1 for 10									) || '''::date do instead insert into ' || sub_tab_name || '(' ; value_desc := 'values (' ; open fetch_sub_column_refcursor ; loop fetch fetch_sub_column_refcursor into column_name_desc ;								if found then									sql_desc := sql_desc || column_name_desc || ',' ; value_desc := value_desc || 'new.' || column_name_desc || ',' ;								else									exit ;								end								if ;								end loop ; sql_desc := substring (									sql_desc									from										1 for length (sql_desc) - 1								) || ')' ; value_desc := substring (									value_desc									from										1 for length (value_desc) - 1								) || ');' ; all_sql_desc := sql_desc || value_desc ;  execute all_sql_desc ; close fetch_sub_column_refcursor ;							else							end							if ;							else							end							if ;							else 								exit ;							end							if ;							end loop ; close fetch_sub_tab_refcursor ;  return fetch_sub_tab_refcursor ; exception							when others then								raise exception 'error--(%)',sqlerrm ;							end ; $body$ language plpgsql;--------调用方式----有两个参数,第一个是主表名,第二个是根据哪个字段进行分表------  begin;select	cursor_demo (		'your_table_name','your_fIEld'	);commit;
总结

以上是内存溢出为你收集整理的postgresql 分表规则实时修改全部内容,希望文章能够帮你解决postgresql 分表规则实时修改所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1172012.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存