PostgreSQL Antipatterns: yi data fori a okunfa

Laipẹ tabi ya, ọpọlọpọ ni o dojukọ iwulo lati ṣatunṣe ohun kan lọpọlọpọ ninu awọn igbasilẹ tabili. Mo ni tẹlẹ sọ fun mi bi o ṣe le ṣe dara julọ, ati bii - o dara ki a ma ṣe. Loni Emi yoo sọrọ nipa abala keji ti imudojuiwọn ọpọ - nipa awọn okunfa.

Fun apẹẹrẹ, lori tabili kan ninu eyiti o nilo lati ṣe atunṣe nkan kan, okunfa buburu kan wa ON UPDATE, Gbigbe gbogbo awọn ayipada si diẹ ninu awọn akojọpọ. Ati pe o nilo lati ṣe imudojuiwọn ohun gbogbo (pilẹṣẹ aaye tuntun kan, fun apẹẹrẹ) ni pẹkipẹki ki awọn ẹya wọnyi ko ni kan.

Jẹ ki a kan pa awọn okunfa!

BEGIN;
  ALTER TABLE ... DISABLE TRIGGER ...;
  UPDATE ...; -- тут долго-долго
  ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;

Lootọ, iyẹn ni gbogbo - ohun gbogbo ti wa ni adiye.

Nitori ALTER TABLE faṣẹ Wiwọle Iyasoto-Titiipa labẹ eyiti ko si ẹnikan ti nṣiṣẹ ni afiwe, paapaa ọkan ti o rọrun SELECT, kii yoo ni anfani lati ka ohunkohun lati tabili. Iyẹn ni, titi ti iṣowo yii yoo pari, gbogbo eniyan ti o paapaa fẹ lati “ka” yoo duro. Ati pe a ranti iyẹn UPDATE a gun...

Jẹ ki a yara pa a, lẹhinna yara tan-an!

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

UPDATE ...;

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

Nibi ipo naa ti dara julọ, akoko idaduro jẹ pataki kere si. Ṣugbọn awọn iṣoro meji nikan ba gbogbo ẹwa jẹ:

  • ALTER TABLE ara nduro fun gbogbo awọn miiran mosi lori tabili, pẹlu gun SELECT
  • Lakoko ti okunfa naa wa ni pipa, eyikeyi iyipada yoo "fò nipasẹ" ninu tabili, kii ṣe tiwa paapaa. Ati pe kii yoo wọle sinu awọn ẹya, botilẹjẹpe o yẹ. Wahala!

Ṣiṣakoṣo awọn iyipada Ikoni

Nitorinaa, ninu ẹya ti tẹlẹ a wa kọja aaye ipilẹ kan - a nilo lati bakan kọ okunfa lati ṣe iyatọ awọn iyipada “wa” ninu tabili lati “kii ṣe tiwa”. “Tiwa” ni a fo bi o ti jẹ, ati “kii ṣe tiwa” ni a fa. Fun eyi o le lo igba oniyipada.

igba_replication_role

Ka Afowoyi:

Ilana okunfa tun ni ipa nipasẹ iyipada iṣeto igba_replication_role. Nigbati o ba mu ṣiṣẹ laisi awọn itọnisọna siwaju sii (aiyipada), awọn okunfa yoo tan ina nigbati ipa atunwi jẹ “ipilẹṣẹ” (aiyipada) tabi “agbegbe”. Awọn okunfa ṣiṣẹ nipasẹ awọn ilana ENABLE REPLICA, yoo ṣiṣẹ nikan ti o ba lọwọlọwọ igba mode - “ajọra”, ati awọn okunfa ṣiṣẹ nipa sisọ ENABLE ALWAYS, yoo jẹ okunfa laibikita ipo isọdọtun lọwọlọwọ.

Emi yoo fẹ lati tẹnumọ paapaa pe eto naa ko kan gbogbo eniyan ni ẹẹkan, bii ALTER TABLE, sugbon nikan si wa lọtọ pataki asopọ. Ni apapọ, nitorinaa ko si awọn okunfa ohun elo ti o fa:

SET session_replication_role = replica; -- выключили триггеры
UPDATE ...;
SET session_replication_role = DEFAULT; -- вернули в исходное состояние

Ipo inu ohun okunfa

Ṣugbọn aṣayan ti o wa loke n ṣiṣẹ fun gbogbo awọn okunfa ni ẹẹkan (tabi o nilo lati "yipada" ni ilosiwaju awọn okunfa ti o ko fẹ lati mu). Ati pe ti a ba nilo "pa" ọkan pato okunfa?

Eyi yoo ran wa lọwọ oniyipada igba "olumulo".:

Awọn orukọ paramita itẹsiwaju ni a kọ bi atẹle: orukọ itẹsiwaju ti o tẹle pẹlu aami kan ati lẹhinna orukọ paramita funrararẹ, iru si awọn orukọ ohun kikun ni SQL. Fun apẹẹrẹ: plpgsql.variable_conflict.
Niwọn igba ti awọn aṣayan ti kii ṣe eto le ṣeto ni awọn ilana ti ko ṣe fifuye module itẹsiwaju ti o baamu, PostgreSQL gba awọn iye fun eyikeyi awọn orukọ pẹlu meji irinše.

Ni akọkọ a ṣe atunṣe okunfa, nkan bii eyi:

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

Nipa ọna, eyi le ṣee ṣe "ifiwe", laisi idinamọ, nipasẹ CREATE OR REPLACE fun iṣẹ okunfa. Ati lẹhinna ninu asopọ pataki a ṣeto oniyipada “wa”:


SET mycfg.my_table_convert_process = 'TRUE';
UPDATE ...;
SET mycfg.my_table_convert_process = ''; -- вернули в исходное состояние

Ṣe o mọ awọn ọna miiran? Pin ninu awọn asọye.

orisun: www.habr.com

Fi ọrọìwòye kun