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.

session_replication_role

Heluhelu manual:

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?

E kōkua kēia iā mākou "mea hoʻohana".:

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 = ''; -- вернули в исходное состояние

ʻIke ʻoe i nā ala ʻē aʻe? Kaʻana ma nā manaʻo.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka