Π Π°Π½ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΠ·Π΄Π½ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡΡΡ Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΡ ΡΡΠΎ-ΡΠΎ ΠΌΠ°ΡΡΠΎΠ²ΠΎ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ Π² Π·Π°ΠΏΠΈΡΡΡ
ΡΠ°Π±Π»ΠΈΡΡ. Π― ΡΠΆΠ΅
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π½Π° ΡΠ°Π±Π»ΠΈΡΠ΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΉ Π²Π°ΠΌ Π½Π°Π΄ΠΎ ΡΡΠΎ-ΡΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΡΡ, Π²ΠΈΡΠΈΡ Π·Π»ΠΎΠ±Π½ΡΠΉ ΡΡΠΈΠ³Π³Π΅Ρ 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
Π§ΠΈΡΠ°Π΅ΠΌ
ΠΠ° ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΡΠ°Π±Π°ΡΡΠ²Π°Π½ΠΈΡ ΡΡΠΈΠ³Π³Π΅ΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ Π²Π»ΠΈΡΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ
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