Mar dhow ama hadhow, dad badan ayaa la kulma baahida loo qabo in wax ka beddel weyn lagu sameeyo gelinta miiska. hore ayaan , 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 TABLEwuxuu sugayaa dhammaan hawlgallada kale ee miiska saaran, oo ay ku jiraan kuwa dhaadheerSELECT- 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 .
fadhiga_ku celcelinta_doorka
Akhriso :
Habka kicinta ayaa sidoo kale saameeya doorsoomaha qaabeynta Kiciyeyaasha 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 cayimayENABLE 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 :
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
