PostgreSQL Antipatterns: hloov cov ntaub ntawv bypassing ib tug trigger

Tsis ntev los sis tom qab, ntau tus tau ntsib nrog qhov yuav tsum tau kho ntau yam hauv cov ntaub ntawv teev tseg. kuv twb muaj lawm qhia kuv yuav ua li cas thiaj zoo dua, thiab yuav ua li cas - nws yog qhov zoo dua tsis ua nws. Hnub no kuv yuav tham txog qhov thib ob ntawm qhov hloov tshiab loj - hais txog qhov tshwm sim.

Piv txwv li, ntawm lub rooj uas koj yuav tsum tau kho ib yam dab tsi, ib tug phem trigger hangs ON UPDATE, hloov tag nrho cov kev hloov pauv rau qee qhov sib sau ua ke. Thiab koj yuav tsum tau hloov kho txhua yam (pib qhov chaw tshiab, piv txwv li) ua tib zoo kom cov kev sib sau no tsis cuam tshuam.

Cia li lov tes taw cov triggers!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- Ρ‚ΡƒΡ‚ Π΄ΠΎΠ»Π³ΠΎ-Π΄ΠΎΠ»Π³ΠΎ
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Qhov tseeb, qhov ntawd yog txhua yam - txhua yam yog dai.

Vim hais tias ALTER TABLE imposes Access Exclusive- ib lub xauv nyob rau hauv uas tsis muaj leej twg khiav nyob rau hauv parallel, txawm ib tug yooj yim SELECT, yuav tsis muaj peev xwm nyeem dab tsi los ntawm lub rooj. Ntawd yog, kom txog thaum qhov kev hloov pauv no xaus, txhua tus neeg uas xav tau txawm tias "nyeem" yuav tos. Thiab peb nco ntsoov qhov ntawd UPDATE peb muaj ntev...

Cia peb ceev nws tawm, ces tig nws sai sai!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;

UPDATE ...;

BEGIN;
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Ntawm no qhov xwm txheej twb zoo dua, lub sijhawm tos tsawg dua. Tab sis tsuas yog ob qho teeb meem ua rau tag nrho cov kev zoo nkauj:

  • ALTER TABLE nws tus kheej tos rau tag nrho lwm cov haujlwm ntawm lub rooj, suav nrog ntev SELECT
  • Thaum lub teeb tawm, "fly by" tej kev hloov nyob rau hauv lub rooj, tsis txawm peb. Thiab nws yuav tsis nkag mus rau hauv kev sib sau, txawm tias nws yuav tsum. Teeb meem!

Tswj kev sib tham sib txawv

Yog li ntawd, nyob rau hauv lub dhau los version, peb stumbled raws li ib tug tseem ceeb point - peb yuav tsum tau qhia ib tug ua kom paub qhov txawv "peb" kev hloov nyob rau hauv lub rooj ntawm "tsis yog peb li". "Peb" raug hla raws li yog, tab sis ntawm "tsis yog peb" lawv tau ua. Rau qhov no koj tuaj yeem siv kev sib hloov pauv.

session_replication_role

Nyeem phau ntawv:

Lub trigger mechanism tseem cuam tshuam los ntawm kev hloov pauv hloov pauv session_replication_role. Enabled yam tsis muaj cov lus qhia ntxiv (default), cov teeb meem yuav tua thaum lub luag hauj lwm replication yog "keeb kwm" (default) los yog "hauv zos". Triggers enabled los ntawm kev qhia ENABLE REPLICA, yuav ua haujlwm tsuas yog hom kev sib kho tam sim no - "replica", thiab triggers enabled los ntawm kev qhia ENABLE ALWAYS, yuav ua hauj lwm tsis hais hom replication tam sim no.

Kuv yuav tshwj xeeb tshaj yog hais tias qhov chaw tsis siv rau tag nrho-tag nrho ib zaug, xws li ALTER TABLE, tab sis tsuas yog rau peb qhov kev sib txuas tshwj xeeb. Nyob rau hauv tag nrho, yog li ntawd tsis muaj daim ntawv thov triggers ua hauj lwm:

SET session_replication_role = replica; -- Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹
UPDATE ...;
SET session_replication_role = DEFAULT; -- Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ Π² исходноС состояниС

Condition nyob rau hauv trigger

Tab sis cov kev xaiv saum toj no ua haujlwm rau txhua qhov ua rau ib zaug (lossis koj yuav tsum "lwm" ua ntej uas koj tsis xav lov tes taw). Thiab yog tias peb xav tau "tua" ib qho kev qhia tshwj xeeb?

Qhov no yuav pab tau peb "neeg siv" kev sib hloov pauv:

Extension parameter npe tau sau raws li hauv qab no: lub npe txuas ntxiv ua raws li lub ntsiab lus thiab tom qab ntawd lub npe parameter nws tus kheej, zoo ib yam li tag nrho cov npe khoom hauv SQL. Piv txwv li: plpgsql.variable_conflict.
Vim tias cov kev xaiv tawm ntawm lub kaw lus tuaj yeem teeb tsa hauv cov txheej txheem uas tsis thauj khoom txuas ntxiv tsim nyog, PostgreSQL lees txais muaj nuj nqis rau txhua lub npe nrog ob yam.

Ua ntej, peb ua tiav qhov txhais, qee yam zoo li no:

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;
...

Los ntawm txoj kev, qhov no tuaj yeem ua "rau cov txiaj ntsig", yam tsis muaj kev thaiv, dhau los CREATE OR REPLACE rau qhov kev ua haujlwm ntawm kev ua haujlwm. Thiab tom qab ntawd hauv kev sib txuas tshwj xeeb peb cock "peb" sib txawv:


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ Π² исходноС состояниС

Koj puas paub lwm txoj kev? Qhia tawm hauv cov lus.

Tau qhov twg los: www.hab.com

Ntxiv ib saib