Eu tenho uma tabela no postgis da seguinte forma:
CREATE TABLE public.a_meter (
smid integer NOT NULL,
smgeometry public.geometry(Point,32640) NOT NULL,
install_node_code text,
"ID" text,
proj_id text,
voltage_level public.voltage_level_enum2,
design_status public.mv_pole_des,
serial text,
feeder_name text,
specific_id text,
sequence_num smallint,
amp_ratio text,
man_year integer,
ins_year integer,
mspec_no text,
description text,
angle smallint DEFAULT 0,
dist_name public.dist_name_enum,
manufactor text GENERATED ALWAYS AS (public.get_manufactor(mspec_no)) STORED,
spec_name text GENERATED ALWAYS AS (public.a_meter_spec_name(specific_id)) STORED,
type_ad text GENERATED ALWAYS AS (public.a_meter_type_ad(specific_id)) STORED,
maxmtr text GENERATED ALWAYS AS (public.a_meter_maxmtr(specific_id)) STORED,
"Type" text GENERATED ALWAYS AS (public.a_meter_type(specific_id)) STORED,
rat_cur text GENERATED ALWAYS AS (public.a_meter_rat_cur(specific_id)) STORED
);
Como é óbvio, existem várias colunas geradas nele. Eu faço um backup usando o seguinte script:
pg_dump.exe --file "C:\\Users\\rasam\\Desktop\\PG_gis.sql" --host "localhost" --port "5432" --username "postgres" --no-password --verbose --format=p --inserts --table "public.a_meter" "electricity"
No entanto, o backup gerado não é um código SQL válido, pois o backup das colunas geradas não é feito corretamente. Os valores são armazenados como uma coluna normal da seguinte forma:
INSERT INTO public.a_meter VALUES (204, '0101000020807F00008FC2F528A22A204115AE47A1FFA14F41', '', 'AMP3153546', '', '', 'اجرا شده', '', 'نادر - PDS3570966 - 8', '7', NULL, '', NULL, NULL, '22', '', 180, 'بجنورد', 'BEW', 'AMP017', 'آنالوگ', 'ندارد', 'BE-96', '');
O estranho é que quando eu clone o esquema da tabela e preencho com os dados, o backup é produzido corretamente. Mas não posso fazer isso para todas as mesas de todos os meus clientes.
O bug é seu: você mentiu para o banco de dados dizendo que uma função como
public.get_manufactor(text)
isIMMUTABLE
, quando na verdade parece depender de outros dados do banco de dados. Você só pode rotular uma funçãoIMMUTABLE
se ela retornar o mesmo resultado para o mesmo argumento, não importa o que esteja no banco de dados .A maneira correta de armazenar dados redundantes (se você precisar armazená-los) é usar uma coluna regular e preenchê-la com um
BEFORE INSERT OR UPDATE
gatilho.