PostgreSQL Antipatterns: huri i nga raraunga ma te whakawhiti i te keu

Ake ake nei, he tokomaha kei te anga ki te whakatika nui i tetahi mea kei roto i nga rekoata ripanga. kua oti ano i ahau korero mai ki ahau me pehea te pai ake, me pehea - he pai ake kia kaua e mahia. I tenei ra ka korero ahau mo te waahanga tuarua o te whakahou papatipu - e pā ana ki te keu.

Hei tauira, i runga i te teepu e hiahia ana koe ki te whakatika i tetahi mea, ka iri he keu kino ON UPDATE, te whakawhiti i nga huringa katoa ki etahi whakahiato. A me whakahou e koe nga mea katoa (whakaarahia he mara hou, hei tauira) kia tupato kia kore e pa ki enei whakahiato.

Me whakakore noa nga keu!

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

Inaa, koinei anake - kei te iri nga mea katoa.

No te mea ALTER TABLE whakatau Whakauru Motuhake- he raka i raro karekau he tangata e rere whakarara, ahakoa he maamaa noa SELECT, e kore e taea te panui i tetahi mea mai i te ripanga. Arā, tae noa ki te mutunga o tenei tauwhitinga, ko nga tangata katoa e hiahia ana ki te "panui noa" ka tatari. A ka mahara tatou ki tera UPDATE he roa taatau ...

Kia hohoro te whakaweto, katahi ka tere!

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

UPDATE ...;

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

I konei kua pai ake te ahuatanga, he iti ake te wa tatari. Engari e rua noa nga raruraru ka pahuatia te ataahua katoa:

  • ALTER TABLE ko ia ano e tatari ana mo etahi atu mahi katoa i runga i te tepu, tae atu ki nga mahi roa SELECT
  • I te wa e weto ana te keu "rere ma" tetahi huringa i roto i te tepu, e hara i ta matou. A e kore e uru ki roto i nga whakahiato, ahakoa me tika. raruraru!

Te whakahaere i nga taurangi wahanga

Na, i roto i te putanga o mua, i tutuki taatau ki runga i tetahi kaupapa - me ako tatou i te keu ki te wehewehe i nga huringa "tatou" i roto i te ripanga mai i te "ehara i a maatau". Ko te "tatou" ka pekehia, engari i runga i te "ehara i a maatau" ka puta. Mo tenei ka taea e koe te whakamahi taurangi wātū.

wahanga_whakarua_turanga

Pānui ā-ringa:

Ka pangia ano te tikanga keu e te taurangi whirihoranga wahanga_whakarua_turanga. Whakahohehia me te kore he tohutohu taapiri (taunoa), ka puhipuhi nga keu ina he "taketake" (taunoa) te mahi tukurua, "rohe" ranei. Whakahohe nga keu ma te tautuhi ENABLE REPLICA, ka mahi anake mena aratau wahanga o naianei - "whakarite", me nga keu e taea ana ma te tohu ENABLE ALWAYS, ka mahi ahakoa te aratau tukurua o naianei.

Ka tino whakanuia e au ko te waahi kaore e pa ki te katoa-katoa i te wa kotahi, penei ALTER TABLE, engari ki to tatou hononga motuhake motuhake. Hui katoa, kia kore ai he tono e whakaoho i te mahi:

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

Te ahua o roto keu

Engari ko te whiringa i runga ake nei ka mahi mo nga kaiwhaiwhai katoa i te wa kotahi (ka hiahia ranei koe ki te "whakarereke" i mua i te mea kaore koe e hiahia ki te whakakore). A ki te hiahia tatou "whakaweto" tetahi keu motuhake?

Ka awhina tenei i a maatau "kaiwhakamahi" taurangi wahanga:

Ko nga ingoa tawhā toronga ka tuhia penei: ko te ingoa toronga ka whai i te ira me te ingoa tawhā ake, he rite ki nga ingoa ahanoa katoa i roto i te SQL. Hei tauira: plpgsql.variable_conflict.
Na te mea ka taea te whakarite i nga whiringa ki waho o te punaha ki nga tukanga kaore e utaina te waahanga toronga tika, ka whakaae a PostgreSQL uara mo nga ingoa e rua nga waahanga.

Tuatahi, ka whakatauhia e matou te keu, penei:

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

Ma te ara, ka taea tenei "mo te painga", me te kore e aukati, na roto CREATE OR REPLACE mo te mahi keu. Na, i roto i te hononga motuhake ka taraihia e tatou "to tatou" taurangi:


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

E mohio ana koe ki etahi atu huarahi? A faaite i roto i nga korero.

Source: will.com

Tāpiri i te kōrero