Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΊΡΡΠ½ΠΎ ΠΌΠ½ΠΎΠ·ΠΈΠ½Π° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Ρ Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΌΠ°ΡΠΎΠ²ΠΎ Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°Ρ Π½Π΅ΡΠΎ Π² Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. ΠΠ΅ΡΠ΅ ΠΈΠΌΠ°ΠΌ
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΠΌΠ°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΠ΅ Π½Π΅ΡΠΎ, Π²ΠΈΡΠΈ Π·ΡΠ» ΡΠΏΡΡΡΠΊ 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
- ΠΠΎΠΊΠ°ΡΠΎ ΡΠΏΡΡΡΠΊΡΡ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½, "ΠΏΡΠ΅Π»ΠΈΡΠ°" Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π΄ΠΎΡΠΈ ΠΈ Π½Π°ΡΠ°ΡΠ°. Π Π½ΡΠΌΠ° Π΄Π° Π²Π»Π΅Π·Π΅ Π² Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ΅, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΡΡΠ±Π²Π°. Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠΈ!
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠΈΠΉΠ½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
Π ΡΠ°ΠΊΠ°, Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ ΡΠ΅ Π½Π°ΡΡΠΊΠ½Π°Ρ
ΠΌΠ΅ Π½Π° ΡΡΠ½Π΄Π°ΠΌΠ΅Π½ΡΠ°Π»Π½Π° ΡΠΎΡΠΊΠ° - ΡΡΡΠ±Π²Π° ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π΄Π° Π½Π°ΡΡΠΈΠΌ ΡΡΠΈΠ³Π΅ΡΠ° Π΄Π° ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° βΠ½Π°ΡΠΈΡΠ΅β ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΎΡ βΠ½Π΅ Π½Π°ΡΠΈΡΠ΅β. βΠΠ°ΡΠΈΡΠ΅β ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ ΡΠ°ΠΊΠ°, ΠΊΠ°ΠΊΡΠΎ ΡΠ°, Π½ΠΎ Π½Π° βΠ½Π΅ Π½Π°ΡΠΈΡΠ΅β ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ. ΠΠ° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅
ΡΠ΅ΡΠΈΡ_ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ_ΡΠΎΠ»Ρ
ΠΡΠΎΡΠ΅ΡΠΈ
ΠΠ°Π΄Π΅ΠΉΡΡΠ²Π°ΡΠΈΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΡΠΌ ΡΡΡΠΎ ΡΠ΅ Π²Π»ΠΈΡΠ΅ ΠΎΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°
ΡΠ΅ΡΠΈΡ_ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ_ΡΠΎΠ»Ρ . ΠΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅), ΡΡΠΈΠ³Π΅ΡΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠΎΠ»ΡΡΠ° Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π΅ "origin" (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅) ΠΈΠ»ΠΈ "local". ΠΠ°Π΄Π΅ΠΉΡΡΠ²Π°Π½ΠΈΡ, Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΈ ΡΡΠ΅Π· ΠΏΠΎΡΠΎΡΠ²Π°Π½Π΅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