Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΊΡΡΠ½ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Ρ ΠΎΡΠ° ΡΠ΅ ΡΠ±Π»ΡΡΠΊΠ²Π°Ρ Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΌΠ°ΡΠΎΠ²ΠΈ ΠΊΠΎΡΠ΅ΠΊΡΠΈΠΈ Π² Π·Π°ΠΏΠΈΡΠΈΡΠ΅ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°. ΠΠ· Π²Π΅ΡΠ΅ , Π° ΠΊΠ°ΠΊ β ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅ Π΄Π° Π½Π΅ Π³ΠΎ ΠΏΡΠ°Π²ΠΈΠΌ. ΠΠ½Π΅Ρ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ Π·Π° Π²ΡΠΎΡΠΈΡ Π°ΡΠΏΠ΅ΠΊΡ Π½Π° ΠΌΠ°ΡΠΎΠ²ΠΎΡΠΎ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ β Π·Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠΈΠ³Π΅ΡΠΈ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ Π½Π΅ΡΠΎ, ΠΈΠΌΠ° Π·Π»ΠΎΠ½Π°ΠΌΠ΅ΡΠ΅Π½ ΡΡΠΈΠ³Π΅Ρ ON UPDATE, ΠΊΠΎΠΉΡΠΎ ΠΏΡΠ΅Π½Π°ΡΡ Π²ΡΠΈΡΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½ΡΠΊΠ°ΠΊΠ²ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈ. Π Π½Π° Π²Π°Ρ Π²ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΠ±Π½ΠΎΠ²ΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΎ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½ΠΎΠ²ΠΎ ΠΏΠΎΠ»Π΅) ΡΠ°ΠΊΠ° Π²Π½ΠΈΠΌΠ°ΡΠ΅Π»Π½ΠΎ, ΡΠ΅ ΡΠ΅Π·ΠΈ Π°Π³ΡΠ΅Π³Π°ΡΠΈ Π΄Π° Π½Π΅ Π±ΡΠ΄Π°Ρ Π·Π°ΡΠ΅Π³Π½Π°ΡΠΈ.
ΠΠ΅ΠΊΠ° ΠΏΡΠΎΡΡΠΎ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅ ΡΡΠΈΠ³Π΅ΡΠΈΡΠ΅!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
UPDATE ...; -- ΡΡΠΊ ΡΠ°ΠΊΠ°Π½Π΅
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;Π‘ΠΎΠ±ΡΡΠ²Π΅Π½ΠΎ, ΡΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ β Π²ΡΠΈΡΠΊΠΎ Π²Π΅ΡΠ΅ Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½ΠΎ.
ΠΠ°ΡΠΎΡΠΎ ALTER TABLE Π½Π°Π»Π°Π³Π° AccessExclusive-Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ°, ΠΏΠΎΠ΄ ΠΊΠΎΡΡΠΎ Π½ΠΈΠΊΠΎΠΉ ΠΏΠ°ΡΠ°Π»Π΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ ΡΠ΅, Π΄ΠΎΡΠΈ ΠΏΡΠΎΡΡ SELECT, Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ΅ Π½ΠΈΡΠΎ ΠΎΡ ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°. Π’ΠΎΠ΅ΡΡ, Π΄ΠΎΠΊΠ°ΡΠΎ ΡΠ°Π·ΠΈ ΡΡΠ°Π½Π·Π°ΠΊΡΠΈΡ Π½Π΅ Π·Π°Π²ΡΡΡΠΈ, Π²ΡΠΈΡΠΊΠΈ ΠΆΠ΅Π»Π°Π΅ΡΠΈ Π΄ΠΎΡΠΈ βΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΏΡΠΎΡΠ΅ΡΠ°Ρβ ΡΠ΅ ΡΠ°ΠΊΠ°Ρ. Π Π½ΠΈΠ΅ ΠΏΠΎΠΌΠ½ΠΈΠΌ, ΡΠ΅ UPDATE ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΡΠ»Π³ΠΎ...
ΠΠ΅ΠΊΠ° ΡΠΎΠ³Π°Π²Π° Π±ΡΡΠ·ΠΎ Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅, ΠΏΠΎΡΠ»Π΅ Π±ΡΡΠ·ΠΎ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;
UPDATE ...;
BEGIN;
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;Π’ΡΠΊ ΡΠΈΡΡΠ°ΡΠΈΡΡΠ° Π²Π΅ΡΠ΅ Π΅ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ°, Π²ΡΠ΅ΠΌΠ΅ΡΠΎ Π½Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ Π΅ Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ. ΠΠΎ Π΄Π²Π΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° ΡΠ°Π·Π²Π°Π»ΡΡ ΡΡΠ»Π°ΡΠ° ΠΊΡΠ°ΡΠΎΡΠ°:
ALTER TABLEΡΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ°ΠΊΠ° Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ³ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π° ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Π΄ΡΠ»Π³ΠΈΡΠ΅SELECT- ΠΠΎΠΊΠ°ΡΠΎ ΡΡΠΈΠ³Π΅ΡΡΡ Π΅ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½, Π²ΡΡΠΊΠ° ΠΏΡΠΎΠΌΡΠ½Π° Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ°, Π΄ΠΎΡΠΈ ΠΈ Π½Π΅ Π½Π°ΡΠ°, ΡΠ΅ "ΠΏΡΠΎΠ»Π΅ΡΡ" ΠΏΠΎΠΊΡΠ°ΠΉ Π½Π΅Π³ΠΎ. Π Π² Π°Π³ΡΠ΅Π³Π°ΡΠΈΡΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΏΠ°Π΄Π°, Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΡΡΠ±Π²Π°. ΠΡΠΎΠ±Π»Π΅ΠΌ!
Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ΅ΡΠΈΠΉΠ½ΠΈΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ
Π ΡΠ°ΠΊΠ°, Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ Π²Π°ΡΠΈΠ°Π½Ρ ΠΏΠΎΠΏΠ°Π΄Π½Π°Ρ ΠΌΠ΅ Π½Π° ΠΏΡΠΈΠ½ΡΠΈΠΏΠ΅Π½ ΠΌΠΎΠΌΠ΅Π½Ρ β ΡΡΡΠ±Π²Π° ΠΏΠΎ Π½ΡΠΊΠ°ΠΊΡΠ² Π½Π°ΡΠΈΠ½ Π΄Π° Π½Π°ΡΡΠΈΠΌ ΡΡΠΈΠ³Π΅ΡΠ° Π΄Π° ΡΠ°Π·Π»ΠΈΡΠ°Π²Π° "Π½Π°ΡΠΈΡΠ΅" ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΡΠ°Π±Π»ΠΈΡΠ°ΡΠ° ΠΎΡ "Π½Π΅ Π½Π°ΡΠΈΡΠ΅". "ΠΠ°ΡΠΈΡΠ΅" Π΄Π° ΠΏΡΠΎΠΏΡΡΠΊΠ°Ρ, Π° "Π½Π΅ Π½Π°ΡΠΈΡΠ΅" β Π΄Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ. ΠΠ° ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ .
session_replication_role
Π§Π΅ΡΠ΅ΠΌ :
ΠΠ° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠ° Π½Π° Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Π½Π΅ Π½Π° ΡΡΠΈΠ³Π΅ΡΠΈΡΠ΅ ΡΡΡΠΎ Π²Π»ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½Π°ΡΠ° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° . ΠΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ Π±Π΅Π· Π΄ΠΎΠΏΡΠ»Π½ΠΈΡΠ΅Π»Π½ΠΈ ΡΠΊΠ°Π·Π°Π½ΠΈΡ (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅) ΡΡΠΈΠ³Π΅ΡΠΈ ΡΠ΅ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ, ΠΊΠΎΠ³Π°ΡΠΎ ΡΠΎΠ»Ρ Π½Π° ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ β "origin" (ΠΏΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅) ΠΈΠ»ΠΈ "local". Π’ΡΠΈΠ³Π΅ΡΠΈ, Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅ΡΠΎ
ENABLE REPLICA, ΡΠ΅ ΡΠ΅ Π·Π°Π΄Π΅ΠΉΡΡΠ²Π°Ρ ΡΠ°ΠΌΠΎ Π°ΠΊΠΎ ΡΠ΅ΠΊΡΡΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ Π½Π° ΡΠ΅ΡΠΈΡΡΠ° Π΅ "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 = ''; -- Π²ΡΡΠ½Π°Ρ
ΠΌΠ΅ Π² ΠΏΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅
ΠΠ½Π°Π΅ΡΠ΅ Π»ΠΈ Π΄ΡΡΠ³ΠΈ Π½Π°ΡΠΈΠ½ΠΈ? Π‘ΠΏΠΎΠ΄Π΅Π»Π΅ΡΠ΅ Π² ΠΊΠΎΠΌΠ΅Π½ΡΠ°ΡΠΈΡΠ΅.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
