āĻāĻ āĻšā§āĻ āĻŦāĻž āĻāĻžāϞ āĻšā§āĻ, āĻ āύā§āĻāĻā§āĻ āĻā§āĻŦāĻŋāϞā§āϰ āĻāύā§āĻā§āϰāĻŋāĻā§āϞā§āϤ⧠āĻŦā§āϝāĻžāĻĒāĻ āϏāĻŽā§āĻĒāĻžāĻĻāύāĻž āĻāϰāĻžāϰ āĻĒā§āϰāϝāĻŧā§āĻāύā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāϤ⧠āĻšāϝāĻŧāĨ¤ āĻāĻŽāĻŋ āĻāϤāĻŋāĻŽāϧā§āϝā§āĻ āĻāĻŋāύā§āϤ⧠āϏā§āĻāĻžāĻŦā§ āύāĻž āĻāϰāĻžāĻ āĻāĻžāϞā§āĨ¤ āĻāĻ āĻāĻŽāĻŋ āĻāĻŖ āĻāĻĒāĻĄā§āĻā§āϰ āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧ āĻĻāĻŋāĻāĻāĻŋ āύāĻŋāϝāĻŧā§ āĻāĻĨāĻž āĻŦāϞāĻŦâ āĻā§āϰāĻŋāĻāĻžāϰāĻŋāĻ āϏāĻŽā§āĻĒāϰā§āĻā§.
āĻāĻĻāĻžāĻšāϰāĻŖāϏā§āĻŦāϰā§āĻĒ, āĻā§āĻŦāĻŋāϞā§āϰ āĻāĻĒāϰ āĻāĻāĻāĻŋ āĻā§āώāϤāĻŋāĻāϰ āĻā§āϰāĻŋāĻāĻžāϰ āĻā§āϞāĻā§, āϝā§āĻāĻŋāϤ⧠āĻāĻĒāύāĻžāĻā§ āĻāĻŋāĻā§ āĻāĻāĻāĻž āϏāĻāĻļā§āϧāύ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ 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
