PostgreSQL Antipatterns: mutatio notitia felis praeteriens

Serius vel serius, multi obveniunt cum necessitate ut magnum aliquid in tabulis tabularum figat. Iam habeo dic quid melius facereet quam β€” satius est non facere. Hodie de secunda massae renovationis aspectus loquar - de triggers.

Exempli gratia, in mensa in qua aliquid figere debes, mala felis dependet ON UPDATEomnes mutationes ad quaedam aggregata transferens. Et debes omnia renovare (exempli gratia novum campum inchoare) tam diligenter ut haec aggregata non afficiantur.

Let's just disable the triggers!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- Ρ‚ΡƒΡ‚ Π΄ΠΎΠ»Π³ΠΎ-Π΄ΠΎΠ»Π³ΠΎ
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Nam id omne - omne quod tentorium.

quod ALTER TABLE imponit Aditus exclusiva- Sera sub qua nemo parallele currit, etiam simplex SELECTaliquid de mensa legere non poterit. Hoc est, donec haec transactio finiatur, omnis qui etiam "modo legere" vult, exspectabit. Et meminimus UPDATE longum habemus ...

Cito vertere, dein cito vertere!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;

UPDATE ...;

BEGIN;
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Hic iam melior est rerum conditio, multo minus temporis exspectatio. Sed solae duae difficultates corrumpunt omnem pulchritudinem;

  • ALTER TABLE ipsa in mensa omnes alias operationes, etiam longas, observat SELECT
  • Dum felis non vigilat "volare per" aliqua mutatione ne nostrum quidem in convivio. Et aggregata non ingredietur, licet debet. Tribulatio!

Administrandi sessionem variables

Ita in priore versione in punctum fundamentale incidimus - aliquo modo docemus felis distinguere mutationes "nostrae" in tabula a "non nostra". "Nostra" omittuntur ut est, sed in "nostra" utitur. Hoc enim uti potes sessionem variables.

session_replication_role

Legere manual:

Mechanismus felis etiam afficitur conformatione variabilis session_replication_role. Sine additis instructionibus (default), triggers incendent cum replicatio munus est "originis" (default) vel "loci". Triggers enabled per speciem ENABLE REPLICA, Si non operatur current sessionis modus - "replica", et triggers per specificationem ENABLE ALWAYS, laborabit modo replicandi ratione currentis.

In primis inculcabo occasum non omnibus simul convenire, ut ALTER TABLEsed solum ad singularem nexum nostrum separatum. In integer, nulla ut pharetra accumsan.

SET session_replication_role = replica; -- Π²Ρ‹ΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ Ρ‚Ρ€ΠΈΠ³Π³Π΅Ρ€Ρ‹
UPDATE ...;
SET session_replication_role = DEFAULT; -- Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ Π² исходноС состояниС

Conditio intra felis

Sed haec optio operatur omnibus triggers simul (vel opus est "alternis" triggers in antecessum quod disable non vis). Et si opus "Averte" una specifica felis?

Hoc nos adiuvabit "User" sessionis variabilis:

Extensio parametri nomina ita scripta sunt: ​​extensio nomen a puncto sequitur ac deinde ipsum nomen parametri, similibus nominibus obiecto in SQL. For example: plpgsql.variable_conflict.
Quia optiones extra-systema in processibus componi possunt qui moduli extensionem convenientem non onerant, PostgreSQL accipit values ​​​​ad aliqua nomina in duobus.

Primum felis finalisare, aliquid simile:

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;
...

Obiter hoc fieri potest "ad lucrum", sine impedimento, per CREATE OR REPLACE ad munus felis. Et tunc in nexu speciali variabilis gallus "noster" sumus;


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- Π²Π΅Ρ€Π½ΡƒΠ»ΠΈ Π² исходноС состояниС

Scisne alias vias? Share in comment.

Source: www.habr.com