想象一下这个业务场景,你在一张表插入数据,需要将数据分发到不同的schema的表中,此时一个好的方法就是在function中使用execute format拼接sql语句
create or replace function public.vouchertemp() returns trigger as
$$
declare sche text;
BEGIN
sche:=new.schemaname;--这是此次插入数据的schema,需要将数据insert 到这个schema中
-- if (new.schemaname='user1') then
-- insert into user1.voucher_voucherextrainfo values
-- (new.voucher_id::text,new.physical_location,new.business_purpose,new.note,new.sourced_meta::jsonb,new.extracted_meta::jsonb);
-- end if;
-- if (new.schemaname='user2') then
-- insert into user2.voucher_voucherextrainfo values
-- (new.voucher_id::text,new.physical_location,new.business_purpose,new.note,new.sourced_meta::jsonb,new.extracted_meta::jsonb);
-- end if;
EXECUTE format('insert into %I.voucher_voucherextrainfo(voucher_id_id,physical_location,
business_purpose,note,sourced_meta,extracted) values
($1,$2,$3,$4,$5,$6);',sche)USING new.voucher_id::text,new.physical_location,new.business_purpose,new.note,new.sourced_meta::jsonb,new.extracted_meta::jsonb;
return null;
EXCEPTION
WHEN others THEN
RAISE NOTICE '%; STATE: %', SQLERRM, SQLSTATE;
return null;
END;
$$
language plpgsql;
create trigger vouchertrigger AFTER insert
on public.voucher202203
for each row
execute procedure public.vouchertemp();
--drop trigger vouchertrigger on voucher202203
insert into voucher202203 values(19,'1','1',1,1,'1','1','1','1','{}','1',1,'1','1','1','1',now(),100,'1',
10,10,'{}','kpmg','kpmg','kpmg','1','1','1','1','1','{"name":"kpmg"}',
'{"name":"ell"}',now(),1,now(),'user1')
voucher202203表如下
-- Table: public.voucher202203
-- DROP TABLE IF EXISTS public.voucher202203;
CREATE TABLE IF NOT EXISTS public.voucher202203
(
voucher_id bigint NOT NULL,
voucher_message_digest character varying(40) COLLATE pg_catalog."default",
original_name character varying(255) COLLATE pg_catalog."default",
voucher_uploader bigint NOT NULL,
batch_id integer NOT NULL,
physical_address character varying(255) COLLATE pg_catalog."default",
logical_address character varying(255) COLLATE pg_catalog."default" NOT NULL,
voucher_type_id character(5) COLLATE pg_catalog."default" NOT NULL,
filelack_flag character varying(32) COLLATE pg_catalog."default" NOT NULL,
voucher_source text COLLATE pg_catalog."default" NOT NULL,
file_extension_name character varying(32) COLLATE pg_catalog."default",
voucher_filesize integer,
voucher_related_no character varying(32) COLLATE pg_catalog."default",
voucher_related_type character varying(32) COLLATE pg_catalog."default" NOT NULL,
voucher_no character varying(32) COLLATE pg_catalog."default",
account_code character varying(32) COLLATE pg_catalog."default",
voucher_date timestamp with time zone,
total_amount numeric,
currency character(3) COLLATE pg_catalog."default",
taxable_quantity numeric,
taxes numeric,
voucher_related_staff text COLLATE pg_catalog."default" NOT NULL,
product_name character varying(1024) COLLATE pg_catalog."default",
supplier_name character varying(64) COLLATE pg_catalog."default",
client_name character varying(64) COLLATE pg_catalog."default",
project_name character varying(64) COLLATE pg_catalog."default",
department_name character varying(64) COLLATE pg_catalog."default",
physical_location character varying(255) COLLATE pg_catalog."default",
business_purpose character varying(1024) COLLATE pg_catalog."default",
note character varying(1024) COLLATE pg_catalog."default",
sourced_meta text COLLATE pg_catalog."default",
extracted_meta text COLLATE pg_catalog."default",
create_time timestamp with time zone NOT NULL,
last_modified_by integer,
last_modified_time timestamp with time zone NOT NULL,
schemaname character(20) COLLATE pg_catalog."default",
CONSTRAINT voucher202203_pkey PRIMARY KEY (voucher_id)
)
TABLESPACE pg_default;
ALTER TABLE IF EXISTS public.voucher202203
OWNER to postgres;
-- Trigger: vouchertrigger
-- DROP TRIGGER IF EXISTS vouchertrigger ON public.voucher202203;
CREATE TRIGGER vouchertrigger
AFTER INSERT
ON public.voucher202203
FOR EACH ROW
EXECUTE FUNCTION public.vouchertemp();
https://stackoverflow.com/questions/14065271/how-to-use-execute-format-using-in-postgres-function
https://stackoverflow.com/questions/54159782/postgresql-same-trigger-function-to-update-on-insert-into-different-tables-usin