PostgreSQL เชเชจเซเชŸเชฟเชชเซ‡เชŸเชฐเซเชจ: เชŸเซเชฐเชฟเช—เชฐเชจเซ‡ เชฌเชพเชฏเชชเชพเชธ เช•เชฐเซ€เชจเซ‡ เชกเซ‡เชŸเชพ เชฌเชฆเชฒเซ‹

เชตเชนเซ‡เชฒเชพ เช…เชฅเชตเชพ เชชเช›เซ€เชจเชพ เชธเชฎเชฏเชฎเชพเช‚, เช˜เชฃเชพ เชฒเซ‹เช•เซ‹เชจเซ‡ เชŸเซ‡เชฌเชฒ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชฎเชพเช‚ เชฎเซ‹เชŸเชพ เชชเชพเชฏเซ‡ เช•เช‚เชˆเช• เชธเซเชงเชพเชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเชจเซ‹ เชธเชพเชฎเชจเซ‹ เช•เชฐเชตเซ‹ เชชเชกเซ‡ เช›เซ‡. เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช›เซ‡ เชฎเชจเซ‡ เช•เชนเซเชฏเซเช‚ เช•เซ‡ เชคเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เชตเชงเซ เชธเชพเชฐเซเช‚ เช•เชฐเชตเซเช‚, เช…เชจเซ‡ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ - เชคเซ‡ เชจ เช•เชฐเชตเซเช‚ เชตเชงเซ เชธเชพเชฐเซเช‚ เช›เซ‡. เช†เชœเซ‡ เชนเซเช‚ เชธเชพเชฎเซ‚เชนเชฟเช• เช…เชชเชกเซ‡เชŸเชจเชพ เชฌเซ€เชœเชพ เชชเชพเชธเชพ เชตเชฟเชถเซ‡ เชตเชพเชค เช•เชฐเซ€เชถ - เชŸเซเชฐเชฟเช—เชฐเซเชธ เชตเชฟเชถเซ‡.

เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเช• เชŸเซ‡เชฌเชฒ เชชเชฐ เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชคเชฎเชพเชฐเซ‡ เช•เช‚เชˆเช• เชธเซเชงเชพเชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชคเซเชฏเชพเช‚ เชเช• เชฆเซเชทเซเชŸ เชŸเซเชฐเชฟเช—เชฐ เช›เซ‡ ON UPDATE, เชคเชฎเชพเชฎ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เช…เชฎเซเช• เชเช•เช‚เชฆเชฐเชฎเชพเช‚ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡. เช…เชจเซ‡ เชคเชฎเชพเชฐเซ‡ เชฌเชงเซเช‚ เช…เชชเชกเซ‡เชŸ เช•เชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ (เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชเช• เชจเชตเซเช‚ เช•เซเชทเซ‡เชคเซเชฐ เชถเชฐเซ‚ เช•เชฐเซ‹) เชœเซ‡เชฅเซ€ เช† เชเช•เชฎเซ‹เชจเซ‡ เช…เชธเชฐ เชจ เชฅเชพเชฏ.

เชšเชพเชฒเซ‹ เชซเช•เซเชค เชŸเซเชฐเชฟเช—เชฐเซเชธ เชฌเช‚เชง เช•เชฐเซ€เช!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- ั‚ัƒั‚ ะดะพะปะณะพ-ะดะพะปะณะพ
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

เช–เชฐเซ‡เช–เชฐ, เช†เชŸเชฒเซเช‚ เชœ - เชฌเชงเซเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เช…เชŸเช•เซ€ เช—เชฏเซเช‚ เช›เซ‡.

เช•เชพเชฐเชฃ เช•เซ‡ ALTER TABLE เชฒเชพเชฆเซ‡ เช›เซ‡ เชเช•เซเชธเซ‡เชธ เชเช•เซเชธเช•เซเชฒเซเชเชฟเชต-เชเช• เชคเชพเชณเซเช‚ เช•เซ‡ เชœเซ‡เชจเซ€ เชจเซ€เชšเซ‡ เช•เซ‹เชˆ เชชเชฃ เชธเชฎเชพเช‚เชคเชฐ เชšเชพเชฒเชคเซเช‚ เชจเชฅเซ€, เชเช• เชธเชพเชฎเชพเชจเซเชฏ เชชเชฃ SELECT, เชŸเซ‡เชฌเชฒเชฎเชพเช‚เชฅเซ€ เช•เช‚เชˆเชชเชฃ เชตเชพเช‚เชšเซ€ เชถเช•เชถเซ‡ เชจเชนเซ€เช‚. เชเชŸเชฒเซ‡ เช•เซ‡, เชœเซเชฏเชพเช‚ เชธเซเชงเซ€ เช† เชŸเซเชฐเชพเชจเซเชเซ‡เช•เซเชถเชจ เชชเซ‚เชฐเซเชฃ เชจ เชฅเชพเชฏ เชคเซเชฏเชพเช‚ เชธเซเชงเซ€, "เชซเช•เซเชค เชตเชพเช‚เชšเชตเชพ" เช‡เชšเซเช›เชคเชพ เชฆเชฐเซ‡เช• เชตเซเชฏเช•เซเชคเชฟ เชฐเชพเชน เชœเซ‹เชถเซ‡. เช…เชจเซ‡ เช…เชฎเชจเซ‡ เชคเซ‡ เชฏเชพเชฆ เช›เซ‡ UPDATE เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชฒเชพเช‚เชฌเซ‹ เช›เซ‡ ...

เชšเชพเชฒเซ‹ เชคเซ‡เชจเซ‡ เชเชกเชชเชฅเซ€ เชฌเช‚เชง เช•เชฐเซ€เช, เชชเช›เซ€ เชเชกเชชเชฅเซ€ เชคเซ‡เชจเซ‡ เชšเชพเชฒเซ เช•เชฐเซ€เช!

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

UPDATE ...;

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

เช…เชนเซ€เช‚ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชธเชพเชฐเซ€ เช›เซ‡, เชฐเชพเชน เชœเซ‹เชตเชพเชจเซ‹ เชธเชฎเชฏ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เชฐเซ€เชคเซ‡ เช“เช›เซ‹ เช›เซ‡. เชชเชฐเช‚เชคเซ เชฎเชพเชคเซเชฐ เชฌเซ‡ เชธเชฎเชธเซเชฏเชพเช“ เชฌเชงเซ€ เชธเซเช‚เชฆเชฐเชคเชพเชจเซ‡ เชฌเช—เชพเชกเซ‡ เช›เซ‡:

  • ALTER TABLE เชชเซ‹เชคเซ‡ เชŸเซ‡เชฌเชฒ เชชเชฐเชจเซ€ เช…เชจเซเชฏ เชคเชฎเชพเชฎ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡, เชœเซ‡เชฎเชพเช‚ เชฒเชพเช‚เชฌเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€เชจเซ‹ เชชเชฃ เชธเชฎเชพเชตเซ‡เชถ เชฅเชพเชฏ เช›เซ‡ SELECT
  • เชœเซเชฏเชพเชฐเซ‡ เชŸเซเชฐเชฟเช—เชฐ เชฌเช‚เชง เชนเซ‹เชฏ, เช•เซ‹เชˆเชชเชฃ เชซเซ‡เชฐเชซเชพเชฐ "เช‰เชกเซ€ เชœเชถเซ‡" เชŸเซ‡เชฌเชฒเชฎเชพเช‚, เช†เชชเชฃเซเช‚ เชชเชฃ เชจเชนเซ€เช‚. เช…เชจเซ‡ เชคเซ‡ เชเช•เชฎเซ‹เชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เช•เชฐเชถเซ‡ เชจเชนเซ€เช‚, เชœเซ‹ เช•เซ‡ เชคเซ‡ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช. เชฎเซเชถเซเช•เซ‡เชฒเซ€!

เชธเชคเซเชฐ เชšเชฒเซ‹เชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ

เชคเซ‡เชฅเซ€, เช…เช—เชพเช‰เชจเชพ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช†เชชเชฃเซ‡ เชเช• เชฎเซ‚เชณเชญเซ‚เชค เชฎเซเชฆเซเชฆเชพ เชชเชฐ เช†เชตเซเชฏเชพ - เช†เชชเชฃเซ‡ เช•เซ‹เชˆเช• เชฐเซ€เชคเซ‡ เชŸเซเชฐเชฟเช—เชฐเชจเซ‡ เช•เซ‹เชทเซเชŸเช•เชฎเชพเช‚ "เช†เชชเชฃเชพ" เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ "เช†เชชเชฃเชพ เชจเชนเซ€เช‚" เชฅเซ€ เช…เชฒเช— เชชเชพเชกเชตเชพ เชฎเชพเชŸเซ‡ เชถเซ€เช–เชตเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. "เช†เชชเชฃเซเช‚" เชœเซ‡เชฎ เช›เซ‡ เชคเซ‡เชฎ เช›เซ‹เชกเซ€ เชฆเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡ "เช†เชชเชฃเซเช‚ เชจเชฅเซ€" เชŸเซเชฐเชฟเช—เชฐ เชฅเชฏเซเช‚ เช›เซ‡. เช† เชฎเชพเชŸเซ‡ เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€ เชถเช•เซ‹ เช›เซ‹ เชธเชคเซเชฐ เชšเชฒเซ‹.

เชธเชคเซเชฐ_เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ_เชญเซ‚เชฎเชฟเช•เชพ

เชตเชพเช‚เชšเชตเซเช‚ เชฎเซ‡เชจเซเชฏเซเช…เชฒ:

เชŸเซเชฐเชฟเช—เชฐ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชšเชฒ เชฆเซเชตเชพเชฐเชพ เชชเชฃ เชชเซเชฐเชญเชพเชตเชฟเชค เชฅเชพเชฏ เช›เซ‡ เชธเชคเซเชฐ_เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ_เชญเซ‚เชฎเชฟเช•เชพ. เชœเซเชฏเชพเชฐเซ‡ เชตเชงเซ เชธเซ‚เชšเชจเชพเช“ (เชกเชฟเชซเซ‰เชฒเซเชŸ) เชตเชฟเชจเชพ เชธเช•เซเชทเชฎ เช•เชฐเซ‡เชฒ เชนเซ‹เชฏ, เชคเซเชฏเชพเชฐเซ‡ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟเชจเซ€ เชญเซ‚เชฎเชฟเช•เชพ "เชฎเซ‚เชณ" (เชกเชฟเชซเซ‰เชฒเซเชŸ) เช…เชฅเชตเชพ "เชธเซเชฅเชพเชจเชฟเช•" เชนเซ‹เชฏ เชคเซเชฏเชพเชฐเซ‡ เชŸเซเชฐเชฟเช—เชฐเซเชธ เชซเชพเชฏเชฐ เชฅเชถเซ‡. เชธเซ‚เชšเชจเซ‹ เชฆเซเชตเชพเชฐเชพ เชธเช•เซเชทเชฎ เชŸเซเชฐเชฟเช—เชฐเซเชธ ENABLE REPLICA, เชคเซ‹ เชœ เช•เชพเชฎ เช•เชฐเชถเซ‡ เชตเชฐเซเชคเชฎเชพเชจ เชธเชคเซเชฐ เชฎเซ‹เชก - "เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ", เช…เชจเซ‡ เชŸเซเชฐเชฟเช—เชฐเซเชธ เชธเซเชชเชทเซเชŸ เช•เชฐเซ€เชจเซ‡ เชธเช•เซเชทเชฎ ENABLE ALWAYS, เชตเชฐเซเชคเชฎเชพเชจ เชชเซเชฐเชคเชฟเช•เซƒเชคเชฟ เชฎเซ‹เชกเชจเซ‡ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ€เชงเชพ เชตเชฟเชจเชพ เชŸเซเชฐเชฟเช—เชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชนเซเช‚ เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เชญเชพเชฐเชชเซ‚เชฐเซเชตเช• เชœเชฃเชพเชตเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชธเซ‡เชŸเชฟเช‚เช— เชเช• เชœ เชธเชฎเชฏเซ‡ เชฆเชฐเซ‡เช•เชจเซ‡ เชฒเชพเช—เซ เชชเชกเชคเซ€ เชจเชฅเซ€, เชœเซ‡เชฎ เช•เซ‡ ALTER TABLE, เชชเชฐเช‚เชคเซ เชซเช•เซเชค เช…เชฎเชพเชฐเชพ เช…เชฒเช— เชตเชฟเชถเซ‡เชท เชœเซ‹เชกเชพเชฃ เชฎเชพเชŸเซ‡. เช•เซเชฒ เชฎเชณเซ€เชจเซ‡, เชœเซ‡เชฅเซ€ เช•เซ‹เชˆ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชŸเซเชฐเชฟเช—เชฐเซเชธ เชŸเซเชฐเชฟเช—เชฐ เชจ เชฅเชพเชฏ:

SET session_replication_role = replica; -- ะฒั‹ะบะปัŽั‡ะธะปะธ ั‚ั€ะธะณะณะตั€ั‹
UPDATE ...;
SET session_replication_role = DEFAULT; -- ะฒะตั€ะฝัƒะปะธ ะฒ ะธัั…ะพะดะฝะพะต ัะพัั‚ะพัะฝะธะต

เชŸเซเชฐเชฟเช—เชฐเชจเซ€ เช…เช‚เชฆเชฐเชจเซ€ เชธเซเชฅเชฟเชคเชฟ

เชชเชฐเช‚เชคเซ เช‰เชชเชฐเซ‹เช•เซเชค เชตเชฟเช•เชฒเซเชช เชเช• เชœ เชธเชฎเชฏเซ‡ เชคเชฎเชพเชฎ เชŸเซเชฐเชฟเช—เชฐเซเชธ เชฎเชพเชŸเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ (เช…เชฅเชตเชพ เชคเชฎเชพเชฐเซ‡ เช…เช—เชพเช‰เชฅเซ€ เชŸเซเชฐเชฟเช—เชฐเซเชธ "เชฌเชฆเชฒเชตเชพเชจเซ€" เชœเชฐเซ‚เชฐ เช›เซ‡ เชœเซ‡เชจเซ‡ เชคเชฎเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชจเชฅเซ€). เช…เชจเซ‡ เชœเซ‹ เช†เชชเชฃเชจเซ‡ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ เชเช• เชšเซ‹เช•เซเช•เชธ เชŸเซเชฐเชฟเช—เชฐ "เชฌเช‚เชง เช•เชฐเซ‹".?

เช† เช…เชฎเชจเซ‡ เชฎเชฆเชฆ เช•เชฐเชถเซ‡ "เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ" เชธเชคเซเชฐ เชšเชฒ:

เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชจเชพเชฎเซ‹ เชจเซ€เชšเซ‡ เชชเซเชฐเชฎเชพเชฃเซ‡ เชฒเช–เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡: เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชจเชพเชฎ, เชกเซ‹เชŸ เช…เชจเซ‡ เชชเช›เซ€ เชชเซ‡เชฐเชพเชฎเซ€เชŸเชฐ เชจเชพเชฎ เชชเซ‹เชคเซ‡, SQL เชฎเชพเช‚ เชธเช‚เชชเซ‚เชฐเซเชฃ เชฒเชพเชฏเช•เชพเชค เชงเชฐเชพเชตเชคเชพ เช‘เชฌเซเชœเซ‡เช•เซเชŸ เชจเชพเชฎเซ‹ เชœเซ‡เชตเซเช‚ เชœ. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡: plpgsql.variable_conflict.
เช…เชจเซเชฐเซ‚เชช เชเช•เซเชธเซเชŸเซ‡เช‚เชถเชจ เชฎเซ‹เชกเซเชฏเซเชฒ เชฒเซ‹เชก เชจ เช•เชฐเชคเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเช“เชฎเชพเช‚ เชฌเชฟเชจ-เชธเชฟเชธเซเชŸเชฎ เชตเชฟเช•เชฒเซเชชเซ‹ เชธเซ‡เชŸ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, PostgreSQL เชธเซเชตเซ€เช•เชพเชฐเซ‡ เช›เซ‡ เชฌเซ‡ เช˜เชŸเช•เซ‹ เชธเชพเชฅเซ‡ เช•เซ‹เชˆเชชเชฃ เชจเชพเชฎ เชฎเชพเชŸเซ‡ เชฎเซ‚เชฒเซเชฏเซ‹.

เชชเซเชฐเชฅเชฎ เช†เชชเชฃเซ‡ เชŸเซเชฐเชฟเช—เชฐเชจเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเซ€เช เช›เซ€เช, เช•เช‚เชˆเช• เช†เชจเชพ เชœเซ‡เชตเซเช‚:

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

เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, เช†เชจเซ‡ เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ, "เชฒเชพเช‡เชต" เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡ CREATE OR REPLACE เชŸเซเชฐเชฟเช—เชฐ เชซเช‚เช•เซเชถเชจ เชฎเชพเชŸเซ‡. เช…เชจเซ‡ เชชเช›เซ€ เชตเชฟเชถเชฟเชทเซเชŸ เชœเซ‹เชกเชพเชฃเชฎเชพเช‚ เช†เชชเชฃเซ‡ "เช…เชฎเชพเชฐเซเช‚" เชšเชฒ เชธเซ‡เชŸ เช•เชฐเซ€เช เช›เซ€เช:


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- ะฒะตั€ะฝัƒะปะธ ะฒ ะธัั…ะพะดะฝะพะต ัะพัั‚ะพัะฝะธะต

เชถเซเช‚ เชคเชฎเซ‡ เชฌเซ€เชœเซ€ เชฐเซ€เชคเซ‹ เชœเชพเชฃเซ‹ เช›เซ‹? เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชถเซ‡เชฐ เช•เชฐเซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹