PostgreSQL Antipatterns: beddel xogta ka gudubta kicinta

Mar dhow ama hadhow, dad badan ayaa la kulma baahida loo qabo in wax ka beddel weyn lagu sameeyo gelinta miiska. hore ayaan ii sheegay sida loo sameeyo si ka wanaagsan, laakiin way fiicantahay inaadan sidaa yeelin. Maanta waxaan ka hadli doonaa qaybta labaad ee cusbooneysiinta tirada badan - ku saabsan kicinta.

Tusaale ahaan, waxa miiska dul saaran kiciye shar leh oo aad u baahan tahay inaad wax ku saxdo. ON UPDATE, kaas oo u gudbiya dhammaan isbeddelada isku-darka qaarkood. Oo waxaad u baahan tahay inaad wax walba cusboonaysiiso (bilow goob cusub, tusaale ahaan) si taxadir leh oo isu-geyntan aan loo saameyn.

Aan daminno kiciyeyaasha!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- тут долго-долго
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Taasi waa waxa ku dhan, dhab ahaantii. wax walba waa hore u laadlaadsan yihiin.

Sababtoo ah ALTER TABLE soo rogi Helitaanka Gaarka ah- quful aan cidi ku soconayn, xataa mid fudud SELECT,ma awoodi doono in uu wax ka akhriyo miiska. Tani waxay ka dhigan tahay in ilaa macaamilkan la dhammeeyo, qof kasta oo raba inuu "kaliya wax akhriyo" waa inuu sugo. Taasna waan xasuusannahay UPDATE waxaan leenahay lo-o-o-ong...

Aan si degdeg ah u daminno ka dibna dhaqso u shid!

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

UPDATE ...;

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

Xaaladdu mar hore ayay halkan ka roon tahay, wakhtiga sugitaanka aad buu u gaaban yahay. Laakiin laba dhibaato oo keliya ayaa xumeeya quruxda:

  • ALTER TABLE wuxuu sugayaa dhammaan hawlgallada kale ee miiska saaran, oo ay ku jiraan kuwa dhaadheer SELECT
  • Inta keebka uu maqan yahay, isbedel kastaa wuu duuli doonaa miiska dhexdiisa, xataa annaga ma aha. Oo kaliya kama dhigi doonto isku darka, inkastoo ay tahay. Alla maxaa dhacay!

Maareynta doorsoomayaasha fadhiga

Haddaba, nuqulkii hore, waxaan ku turunturooday qodob muhiim ah: waxaan u baahannahay inaan barno kicinta si aan u kala saarno isbeddellada "anaga" ee miiska iyo "anaga ma aha." Waa inay ka boodo "kayaga" sida ay tahay, oo ay kiciso "anaga ma aha." Tan, waan isticmaali karnaa doorsoomayaasha fadhiga.

fadhiga_ku celcelinta_doorka

Akhriso buug -gacmeed:

Habka kicinta ayaa sidoo kale saameeya doorsoomaha qaabeynta fadhiga_ku celcelinta_doorkaKiciyeyaasha la awooday iyada oo aan la helin wax tilmaamo dheeraad ah (sida caadiga ah) ayaa dab ka kacaya marka doorka taranku yahay "asalka" (sida caadiga ah) ama "maxali ah". Kiciyeyaasha waxaa lagu suurtageliyay in la cayimo ENABLE REPLICA, kaliya shaqayn doona haddii qaabka fadhiga hadda - "ku-noqod", iyo kiciyeyaasha awood iyadoo la cayimay ENABLE ALWAYS, waa la kicin doonaa iyada oo aan loo eegin qaabka ku celcelinta hadda.

Waxaan jeclaan lahaa inaan si gaar ah u nuuxnuuxsado in goobtu aanay khusayn qof walba hal mar, sida ALTER TABLE, laakiin kaliya xiriirkeena gaarka ah. Marka, si looga hortago in wax kiciya codsi ah uu kiciyo:

SET session_replication_role = replica; -- выключили триггеры
UPDATE ...;
SET session_replication_role = DEFAULT; -- вернули в исходное состояние

Xaaladda kicinta gudaha

Laakiin doorashada kore waxay u shaqeysaa dhammaan kiciyeyaasha hal mar (ama waxaan u baahanahay inaan "beddelno" kiciyeyaasha aan dooneynin inaan horay u joojino). Oo haddaynu u baahanahay "Demi" hal kiciye gaar ah?

Tani way ina caawin doontaa doorsoome kalfadhiga "user".:

Magacyada halbeegyada dheeraadka ah waxa loo qoraa sida soo socota: Magaca kordhinta, muddada, ka dibna magaca parameterka laftiisa, oo la mid ah magacyada shayga oo dhammaystiran ee SQL. Tusaale ahaan: plpgsql.variable_conflict.
Maadaama xuduudaha aan nidaamka ahayn lagu dejin karo habab aan ku shubin moduleka fidinta ee u dhigma, PostgreSQL wuu aqbalayaa qiyamka magac kasta oo leh laba qaybood.

Marka hore, waxaan wax ka beddeleynaa kicinta, wax sidan oo kale ah:

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

Jid ahaan, tan waxaa la samayn karaa "nool", iyada oo aan la xannibin, iyada oo loo marayo CREATE OR REPLACE shaqada kicinta. Kadibna xiriirka gaarka ah waxaan dejinay doorsoome "our":


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- вернули в исходное состояние

Ma taqaanaa habab kale? La wadaag faallooyinka.

Source: www.habr.com

U soo iibso martigelin lagu kalsoonaan karo oo loogu talagalay bogagga leh ilaalinta DDoS, VPS VDS servers 🔥 Iibso martigelin degel oo lagu kalsoonaan karo oo leh ilaalinta DDoS, VPS VDS servers | ProHoster