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.

karolo_ea_replication

Bala tataiso:

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?

Sena se tla re thusa "mosebelisi" e fapaneng ea nako:

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.

Source: www.habr.com

Eketsa ka tlhaloso