Nā Antipatterns PostgreSQL: hoʻololi i ka ʻikepili ma ke kāʻei ʻana i kahi hoʻoiho
Ma hope a ma hope paha, nui ka poʻe e kū nei i ka pono e hoʻoponopono nui i kekahi mea ma nā moʻolelo papa. Ua loaʻa iaʻu e haʻi mai iaʻu pehea e hana maikaʻi ai, a pehea - ʻoi aku ka maikaʻi o ka hana ʻole. I kēia lā e kamaʻilio wau e pili ana i ka ʻaoʻao ʻelua o ka hoʻonui nui - e pili ana i na mea hooulu.
No ka laʻana, ma kahi papaʻaina kahi e pono ai ʻoe e hoʻoponopono i kekahi mea, kau ʻia kahi mea hoʻoulu ʻino ON UPDATE, e hoʻololi i nā hoʻololi a pau i kekahi mau hui. A pono ʻoe e hōʻano hou i nā mea āpau (hoʻomaka i kahi kahua hou, no ka laʻana) me ke akahele i ʻole e hoʻopili ʻia kēia mau aggregates.
E hoʻopau wale i nā mea hoʻomaka!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
UPDATE ...; -- тут долго-долго
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;
ʻOiaʻiʻo, ʻo ia wale nō - ke kau nei na mea a pau.
No ka mea ALTER TABLE hoʻokau Loaʻa Kūʻokoʻa- he laka ma lalo o ka holo ʻole ʻana o kekahi, ʻo ka mea maʻalahi SELECT, ʻaʻole hiki ke heluhelu i kekahi mea mai ka papaʻaina. ʻO ia, a hiki i ka pau ʻana o kēia kālepa, e kali ka poʻe a pau e makemake e "heluhelu wale". A hoʻomanaʻo mākou i kēlā UPDATE he lōʻihi kā mākou ...
E hoʻopau koke kākou, a laila e hoʻā koke!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;
UPDATE ...;
BEGIN;
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;
Eia ka maikaʻi o ke kūlana, ʻoi aku ka liʻiliʻi o ka manawa kali. Akā ʻelua wale nō pilikia e hoʻopau i ka nani a pau:
ALTER TABLE ke kali nei no nā hana ʻē aʻe a pau ma ka papaʻaina, me nā hana lōʻihi SELECT
ʻOiai ua pio ke kumu "lele ma" kekahi hoʻololi ma ka papaʻaina, ʻaʻole naʻe kā mākou. A ʻaʻole ia e komo i loko o nā aggregates, ʻoiai pono. pilikia!
Ka mālama ʻana i nā loli kau
No laila, i ka ʻaoʻao mua, ua hāʻule mākou i kahi kumu kumu - pono mākou e aʻo i ke kumu e hoʻokaʻawale i nā loli "kā mākou" i ka papaʻaina mai "ʻaʻole kā mākou". Hoʻokuʻu ʻia ʻo "ko mākou" e like me kēia, akā ma "ʻaʻole kā mākou" ua hoʻāla ʻia lākou. No kēia hiki iā ʻoe ke hoʻohana nā hoʻololi kau.
Hoʻopili pū ʻia ka mīkini hoʻoulu e ka hoʻololi hoʻonohonoho session_replication_role. Hoʻohana ʻia me ka ʻole o nā ʻōlelo aʻoaʻo hou (paʻamau), e puhi ʻia nā mea hoʻoiho ke "kumu" (paʻamau) a i ʻole "local" ka hana hou. Hoʻohana ʻia nā mea hoʻomaka ma ka wehewehe ʻana ENABLE REPLICA, e hana wale ina ke ano kau o keia manawa - "hoʻopiʻi", a me nā mea hoʻomaka i hoʻohana ʻia ma ka wehewehe ʻana ENABLE ALWAYS, e hana me ka nānā ʻole i ke ʻano hana hoʻopiʻi o kēia manawa.
E hoʻoikaika nui wau ʻaʻole pili ka hoʻonohonoho i nā mea āpau i ka manawa hoʻokahi, e like me ALTER TABLE, akā i kā mākou pili kūikawā kaʻawale. I ka huina, no laila ʻaʻohe noi e hoʻomaka i ka hana:
SET session_replication_role = replica; -- выключили триггеры
UPDATE ...;
SET session_replication_role = DEFAULT; -- вернули в исходное состояние
Kūlana i loko o ke kumu
Akā ʻo ka koho ma luna nei e hana no nā mea hoʻoiho āpau i ka manawa hoʻokahi (a i ʻole pono ʻoe e "hoʻololi" i nā mea hoʻoiho ma mua ʻaʻole ʻoe makemake e hoʻopau). A inā pono mākou "hoʻopau" i hoʻokahi mea hoʻomaka?
Ua kākau ʻia nā inoa ʻāpana hoʻonui: ʻo ka inoa hoʻonui i ukali ʻia e kahi kiko a laila ka inoa ʻāpana ponoʻī, e like me nā inoa mea piha ma SQL. No ka laʻana: plpgsql.variable_conflict.
No ka mea hiki ke hoʻonohonoho ʻia nā koho ma waho o ka ʻōnaehana i nā kaʻina i hoʻouka ʻole i ka module hoʻonui kūpono, ʻae ʻo PostgreSQL nā waiwai no kēlā me kēia inoa me nā ʻāpana ʻelua.
ʻO ka mea mua, hoʻopau mākou i ka trigger, e like me kēia:
BEGIN
-- процессу конвертации можно делать все
IF current_setting('mycfg.my_table_convert_process') = 'TRUE' THEN
IF TG_OP IN ('INSERT', 'UPDATE') THEN
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END IF;
...
Ma ke ala, hiki ke hana ʻia kēia "no ka loaʻa kālā", me ka ʻole o ka pale ʻana, ma o CREATE OR REPLACE no ka hana kumu. A laila, i loko o ka pilina kūikawā, kā mākou "hoʻololi":
SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- вернули в исходное состояние