PostgreSQL Antipatterns: beddel xogta ka gudubta kicinta

Mar dhow ama hadhow, qaar badan ayaa wajahaya baahida loo qabo in si weyn loo hagaajiyo wax ku jira diiwaannada miiska. hore ayaan u haystay ii sheeg sida loo sii wanaajiyo, iyo sida - waxaa fiican in aan la samayn. Maanta waxaan ka hadli doonaa oo ku saabsan dhinaca labaad ee update mass - ku saabsan kiciyeyaasha.

Tusaale ahaan, miis aad u baahan tahay inaad wax ku hagaajiso, kiciya sharka ayaa sudhan ON UPDATE, ku wareejinta dhammaan isbeddelada isku-darka qaar. Oo waxaad u baahan tahay inaad wax walba cusboonaysiiso (bilow goob cusub, tusaale ahaan) si taxaddar leh oo isu-geyntan aan la taaban.

Aynu damino kiciyayaasha!

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

Dhab ahaantii, taasi waa dhammaan - wax walba waa soo laadlaadsan yihiin.

Sababtoo ah ALTER TABLE soo rogi Helitaanka Gaarka ah- quful aan cidi ku soconayn, xataa mid fudud SELECT, ma awoodi doonaan inay wax ka akhriyaan miiska. Taasi waa, ilaa macaamilkani uu dhammaanayo, qof kasta oo raba inuu xitaa "kaliya akhriyo" wuu sugi doonaa. Taasna waan xasuusannahay UPDATE waxaan leenahay muddo dheer...

Aynu si degdeg ah u daminno, ka dibna dhaqso u shidno!

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

UPDATE ...;

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

Halkan xaaladdu waa horeba way ka fiican tahay, wakhtiga sugitaanka ayaa aad u yar. Laakiin laba dhibaato oo keliya ayaa waxyeeleeya dhammaan quruxda:

  • ALTER TABLE lafteedu waxay sugaysaa dhammaan hawlgallada kale ee miiska saaran, oo ay ku jiraan kuwa dhaadheer SELECT
  • Halka kiciyadu ay dansan tahay "ku duul" isbedel kasta miiska dhexdiisa, xataa annaga ma aha. Oo ma geli doonto isku-darka, inkastoo ay tahay. Dhibaato!

Maareynta doorsoomayaasha fadhiga

Sidaa darteed, nuqulkii hore, waxaan ku turunturooday qodob aasaasi ah - waxaan u baahannahay inaan barno kicinta si aan u kala saarno isbeddelada "anaga" ee miiska "anaga maahan". "Kayaga" sidiisa ayaa loo boodaa, laakiin "kayaga" waa la kiciyaa. Tan waxaad u isticmaali kartaa doorsoomayaasha fadhiga.

fadhiga_ku celcelinta_doorka

Akhriso buug -gacmeed:

Habka kicinta ayaa sidoo kale saameeya doorsoomaha qaabeynta fadhiga_ku celcelinta_doorka. La hawlgeliyay iyada oo aan la helin tilmaamo dheeraad ah (default), kiciyeyaasha ayaa dab kicin doona marka doorka tarayntu uu yahay "asalka" (default) ama "maxali ah". Kiciyeyaasha waxaa lagu suurtageliyay in la cayimo ENABLE REPLICA, shaqayn doona kaliya haddii qaabka fadhiga hadda - "ku-noqod", iyo kiciyeyaasha karti leh iyadoo la cayimay ENABLE ALWAYS, wuu shaqayn doonaa iyada oo aan loo eegin qaabka ku celcelinta hadda.

Waxaan si gaar ah u xoojin doonaa in goobta aysan khuseyn dhammaan-dhammaan hal mar, sida ALTER TABLE, laakiin kaliya xiriirkeena gaarka ah. Isku soo wada duuboo, si aanu codsi kicin kicin u shaqayn:

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

Xaaladda kicinta gudaha

Laakin doorashada kore waxay u shaqeysaa dhammaan kiciyeyaasha hal mar (ama waxaad u baahan tahay inaad horay u sii "bedesho" kiciyeyaasha aadan rabin inaad gabto). Oo haddaynu u baahanahay "Demi" hal kiciye gaar ah?

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

Magacyada parameter-ka dheeraynta waxa loo qoraa sidan soo socota: Magaca kordhinta oo ay ku xigto dhibic ka dibna magaca parameterka laftiisa, oo la mid ah magacyada shayga buuxa ee SQL. Tusaale ahaan: plpgsql.variable_conflict.
Sababtoo ah xulashooyinka ka baxsan nidaamka waxaa lagu dejin karaa habab aan buuxin qaybta fidinta ku habboon, PostgreSQL waxay aqbashaa qiyamka magac kasta oo leh laba qaybood.

Marka hore, waxaan soo gabagabeyneynaa 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;
...

By habka, tan waxaa la samayn karaa "faa'iido", iyada oo aan la xannibin, iyada oo loo marayo CREATE OR REPLACE shaqada kicinta. Kadibna xiriirka gaarka ah waxaan ku dhajineynaa doorsoomayaasha "our":


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

Ma taqaan siyaabo kale? La wadaag faallooyinka

Source: www.habr.com

Add a comment