PostgreSQL Antipatterns: canza bayanai ta ƙetare abin faɗa

Ba dade ko ba dade, mutane da yawa suna fuskantar buƙatar gyara wani abu sosai a cikin bayanan tebur. Na riga gaya mani yadda zan yi da kyau, kuma ta yaya - yana da kyau kada a yi shi. A yau zan yi magana game da bangare na biyu na sabuntawar taro - game da haddasawa.

Alal misali, a kan teburin da kake buƙatar gyara wani abu, wani mugun abu ya rataye ON UPDATE, canja wurin duk canje-canje zuwa wasu tarawa. Kuma kuna buƙatar sabunta komai (fara sabon filin, alal misali) don haka a hankali ba a shafa waɗannan abubuwan tarawa ba.

Mu kawai musaki abubuwan jan hankali!

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

A gaskiya, shi ke nan - komai yana rataye.

Saboda ALTER TABLE dorawa Samun shiga na Musamman- wani kulle a ƙarƙashinsa babu wanda ke gudana a layi daya, ko da mai sauƙi SELECT, ba zai iya karanta wani abu daga tebur ba. Wato, har sai wannan ciniki ya ƙare, duk wanda ke son ko da "karanta kawai" zai jira. Kuma mun tuna da haka UPDATE muna da dogon...

Mu kashe shi da sauri, sannan mu kunna shi da sauri!

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

UPDATE ...;

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

A nan yanayin ya riga ya fi kyau, lokacin jira ya ragu sosai. Amma matsaloli guda biyu ne kawai ke lalata duk kyawun:

  • ALTER TABLE kanta tana jiran duk sauran ayyuka akan tebur, gami da dogayen SELECT
  • Yayin da tsokanar ke kashewa, "tashi ta" kowane canji a teburin, ba ma namu ba. Kuma ba zai shiga cikin tarin ba, ko da yake ya kamata. Matsala!

Sarrafa masu canjin zaman

Don haka, a cikin sigar da ta gabata, mun yi tuntuɓe a kan wani muhimmin batu - muna buƙatar ko ta yaya koyan faɗakarwa don bambanta canje-canjen “namu” a cikin tebur daga “ba namu ba”. "Namu" an tsallake shi kamar yadda yake, amma akan "ba namu ba" an kunna su. Don wannan zaka iya amfani masu canjin zaman.

zaman_replication_role

Karanta manual:

Har ila yau, madaidaicin tsari yana shafar tsarin faɗakarwa zaman_replication_role. An kunna ba tare da ƙarin umarni ba (tsoho), masu jawo za su yi wuta lokacin da aikin maimaitawa ya kasance "asalin" (tsoho) ko "na gida". Ana kunna masu tayar da hankali ta hanyar tantancewa ENABLE REPLICA, zai yi aiki kawai idan yanayin zaman yanzu - "replica", da kuma kunna kunnawa ta hanyar tantancewa ENABLE ALWAYS, zai yi aiki ba tare da la'akari da yanayin kwafi na yanzu ba.

Zan jaddada cewa saitin ba ya shafi duka-duka lokaci guda, kamar yadda ALTER TABLE, amma kawai zuwa ga keɓancewar haɗin yanar gizon mu. Gabaɗaya, don kada wani aikace-aikacen da ke haifar da aiki:

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

Halin da ke ciki

Amma zaɓin da ke sama yana aiki don duk masu faɗakarwa a lokaci ɗaya (ko kuna buƙatar "madaidaicin" abubuwan da ba ku so a kashe). Kuma idan muna bukata "kashe" takamammen faɗakarwa?

Wannan zai taimake mu “mai amfani” madaidaicin zaman:

Ana rubuta sunayen ma'auni kamar haka: sunan tsawo da digo ya biyo baya sannan kuma sunan parameter da kansa, kama da cikakkun sunayen abubuwa a cikin SQL. Misali: plpgsql.variable_conflict.
Saboda za a iya saita zaɓuɓɓukan da ba a cikin tsarin ba a cikin matakan da ba su ɗora madaidaicin tsarin tsawo ba, PostgreSQL ya yarda. dabi'u ga kowane suna tare da sassa biyu.

Da farko, za mu kammala abin da ya jawo, wani abu kamar haka:

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

Af, ana iya yin wannan "don riba", ba tare da toshewa ba, ta hanyar CREATE OR REPLACE don aikin jawo. Sa'an nan kuma a cikin haɗin kai na musamman muna yin ma'anar "mu":


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

Shin kun san wasu hanyoyi? Raba a cikin sharhi.

source: www.habr.com

Add a comment