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