ProHoster > Blog > Tsamaiso > Li-Antipatterns tsa PostgreSQL: fetola data ka ho fetisa mothati
Li-Antipatterns tsa PostgreSQL: fetola data ka ho fetisa mothati
Haufinyane kapa hamorao, ba bangata ba tobane le tlhoko ea ho lokisa ntho e itseng ka har'a lirekoto tsa tafole. Ke se ke entse mpolelle mokhoa oa ho e etsa betere, le joang - ho molemo ho se e etse. Kajeno ke tla bua ka karolo ea bobeli ea ntlafatso ea bongata - ka lintho tse susumetsang.
Ka mohlala, tafoleng eo ho eona u hlokang ho lokisa ntho e itseng, ho leketlile mokelikeli o mobe ON UPDATE, ho fetisetsa liphetoho tsohle ho likarolo tse ling. 'Me u hloka ho ntlafatsa ntho e' ngoe le e 'ngoe (ho qala tšimo e ncha, mohlala) ka hloko hoo likarolo tsena li sa ameheng.
Ha re timang li-triggers!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
UPDATE ...; -- тут долго-долго
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;
Ha e le hantle, ke phetho - ntho e 'ngoe le e 'ngoe e leketlile.
Hobane ALTER TABLE beha Access Exclusive- senotlolo seo ho seng motho ea mathang ka tlas'a sona, esita le se bonolo SELECT, e ke ke ea khona ho bala letho tafoleng. Ke hore, ho fihlela transaction ena e fela, bohle ba batlang ho "bala" feela ba tla ema. Mme re hopola seo UPDATE re na le nako e telele ...
Ha re e time kapele, ebe re e bulela kapele!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;
UPDATE ...;
BEGIN;
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;
Mona boemo bo se bo ntse bo le betere, nako ea ho leta e fokola haholo. Empa ke mathata a mabeli feela a senyang botle bohle:
ALTER TABLE ka boeona e emetse lits'ebetso tse ling tsohle tse tafoleng, ho kenyelletsa le tse telele SELECT
Ha sesebelisoa se tima "fofa ka" phetoho efe kapa efe tafoleng, leha e le ea rona. 'Me e ke ke ea kena ka har'a lihlopha, le hoja e lokela. Mathata!
Ho laola mefuta-futa ea liboka
Kahoo, phetolelong e fetileng, re ile ra khoptjoa ke ntlha ea bohlokoa - ka tsela e itseng re lokela ho ruta se qalang ho khetholla liphetoho tsa "rona" tafoleng ho "eseng tsa rona". "A rona" e qhekelloa joalo ka ha ho le joalo, empa ho "eseng ea rona" ea hlohlelletsoa. Bakeng sa sena u ka sebelisa mefuta-futa ea seboka.
Mochine oa trigger o boetse o angoa ke phetoho ea tlhophiso karolo_ea_replication. E nolofalitsoe ntle le litaelo tse eketsehileng (ka ho feletseng), li-trigger li tla chesa ha karolo ea ho pheta-pheta e le "tšimoloho" (ea kamehla) kapa "ea sebaka". Litlhahiso li nolofalitsoe ka ho hlakisa ENABLE REPLICA, e tla sebetsa ha feela mokhoa oa hona joale oa seboka - "replica", le lintho tse susumetsang tse nolofalitsoeng ka ho hlakisa ENABLE ALWAYS, e tla sebetsa ho sa tsotelehe mokhoa oa hajoale oa ho ikatisa.
Ke tla hatisa ka ho khetheha hore maemo ha a sebetse ho bohle ka nako e le 'ngoe, joalo ka ALTER TABLE, empa feela ho khokahano ea rona e khethehileng e arohaneng. Ka kakaretso, e le hore ho se be le ts'ebetso ea ts'ebeliso e sebetsang:
SET session_replication_role = replica; -- выключили триггеры
UPDATE ...;
SET session_replication_role = DEFAULT; -- вернули в исходное состояние
Boemo ka hare ho qhoma
Empa khetho e ka holimo e sebetsa bakeng sa lintho tsohle tse susumetsang ka nako e le 'ngoe (kapa u hloka "ho fetola" lintho tse susumetsang esale pele tseo u sa batleng ho li thibela). 'Me haeba re hloka "tima" leqhubu le le leng le itseng?
Mabitso a parameter ea katoloso a ngotsoe ka tsela e latelang: lebitso la katoloso le lateloa ke letheba ebe lebitso la paramethara ka boeona, le ts'oana le mabitso a ntho e felletseng ho SQL. Mohlala: plpgsql.variable_conflict.
Hobane likhetho tsa kantle ho sistimi li ka beoa lits'ebetsong tse sa keneng mochini o nepahetseng oa katoloso, PostgreSQL ea amohela boleng ba mabitso afe kapa afe a nang le likarolo tse peli.
Taba ea pele, re phethela trigger, ntho e kang ena:
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;
...
Ka tsela, sena se ka etsoa "bakeng sa phaello", ntle le ho thibela, ka CREATE OR REPLACE bakeng sa ts'ebetso ea trigger. 'Me ka khokahanyo e khethehileng re kopa "rona" e fapaneng:
SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- вернули в исходное состояние
Na u tseba litsela tse ling? Arolelana maikutlong.