分区表自动生成脚本
CREATE FUNCTION "public"."create_table_partition"(IN tablename varchar) RETURNS "text" AS $BODY$ declare date_suffix varchar(6); sqlCon varchar; p_table varchar; begin for i in -72..72 loop select to_char(now() + interval '1 month' * i,'yyyyMM') into date_suffix; p_table='p_'||tablename||'_'||date_suffix; raise notice '%',p_table; sqlCon = 'create table '||p_table||' ( check ( finance_month = '||date_suffix||' ) ) INHERITS ('||tablename||')'; EXECUTE sqlCon; end loop; RETURN date_suffix; end; $BODY$ LANGUAGE plpgsql COST 100 CALLED ON NULL INPUT SECURITY INVOKER VOLATILE;
这个主要是创建前后6年的分区,每个分区表是以月为后缀的,-72...72这个是时间范围可以自行修改。 再来看看自动创建触发器的脚本
CREATE FUNCTION "public"."create_table_insert_trigger"(IN tablename varchar) RETURNS "text" AS $BODY$ declare date_suffix varchar(6); sqlCon varchar; p_table varchar; tmp integer :=0; sqlTrigger varchar; begin sqlCon = 'CREATE OR REPLACE FUNCTION '||tablename||'_insert_trigger() RETURNS TRIGGER AS $$ BEGIN '; sqlTrigger = 'CREATE TRIGGER trg_insert_'||tablename||' BEFORE INSERT ON "public"."'||tablename||'" FOR EACH ROW EXECUTE PROCEDURE "'||tablename||'_insert_trigger"(); COMMENT ON TRIGGER "trg_insert_'||tablename||'" ON "public"."'||tablename||'" IS NULL;'; for i in -72..72 loop select to_char(now() + interval '1 month' * i,'yyyyMM') into date_suffix; p_table='p_'||tablename||'_'||date_suffix; IF tmp=0 THEN sqlCon = sqlCon || 'IF ( NEW.finance_month = '||date_suffix||') THEN INSERT INTO '||p_table||' VALUES (NEW.*); '; tmp =1; ELSE sqlCon = sqlCon || 'ELSIF ( NEW.finance_month = '||date_suffix||') THEN INSERT INTO '||p_table||' VALUES (NEW.*); '; END if; end loop; sqlCon = sqlCon || 'END IF; RETURN NULL; END; $$ LANGUAGE plpgsql;'; EXECUTE sqlCon; EXECUTE sqlTrigger; RETURN sqlCon; end; $BODY$ LANGUAGE plpgsql COST 100 CALLED ON NULL INPUT SECURITY INVOKER VOLATILE;
这个脚本会将前面通过分区脚本创建的分区表中加上相应的触发器,好了,脚本很好理解就不多说了,有问题请留言。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。