Дер ё зуд, бисёр одамон ба зарурати ворид кардани таҳрирҳои азим ба вурудоти ҷадвал дучор мешаванд. ман аллакай , аммо беҳтар аст, ки ин тавр накунед. Имрӯз ман дар бораи ҷанбаи дуюми навсозии оммавӣ гап мезанам - дар бораи ангеза.
Масалан, дар болои миз як триггери бад овезон аст, ки дар он шумо бояд чизеро ислоҳ кунед. ON UPDATE, ки тамоми тағиротро ба агрегатҳои муайян интиқол медиҳад. Ва шумо бояд ҳама чизро навсозӣ кунед (масалан, майдони навро оғоз кунед), то бодиққат ба ин агрегатҳо таъсир нарасонанд.
Биёед танҳо триггерҳоро хомӯш кунем!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
UPDATE ...; -- тут долго-долго
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;Дар асл, ҳама чиз дар он аст. ҳама чиз аллакай овезон аст.
Зеро ALTER TABLE вогузор мекунад Дастрасӣ ба истисноӣ- қулф, ки дар зери он ҳеҷ кас параллел намегузарад, ҳатто як қулфи оддӣ SELECT, аз ҷадвал чизе хонда наметавонад. Ин маънои онро дорад, ки то анҷоми ин муомилот, ҳар касе, ки мехоҳад "танҳо хонда шавад" бояд интизор шавад. Ва мо инро дар хотир дорем UPDATE мо ло-о-о-онг дорем...
Биёед онро зуд хомӯш кунем ва зуд онро фаъол созем!
BEGIN;
ALTER TABLE ... DISABLE TRIGGER ...;
COMMIT;
UPDATE ...;
BEGIN;
ALTER TABLE ... ENABLE TRIGGER ...;
COMMIT;Вазъият дар ин ҷо аллакай беҳтар аст, вақти интизорӣ хеле кӯтоҳтар аст. Аммо танҳо ду мушкилот зебоиро вайрон мекунанд:
ALTER TABLEмунтазири тамоми амалиёти дигар дар сари суфра, аз ҷумла амалиёти дарозSELECT- Дар ҳоле ки триггер хомӯш аст, ҳама гуна тағйирот парвоз хоҳад кард дар ҷадвал, он ҳатто аз они мо нест. Ва он танҳо онро ба агрегатҳо ворид намекунад, гарчанде ки бояд бошад. Чӣ фалокат!
Идоракунии тағирёбандаҳои сессия
Ҳамин тавр, дар версияи қаблӣ мо ба як нуктаи муҳим пешпо хӯрдем: ба мо лозим аст, ки бо кадом роҳе ба триггер фарқ кардани тағироти "мо" дар ҷадвал ва "на аз они мо"-ро омӯзем. Он бояд ҳамчун "аз они мо" гузаред ва дар "на аз они мо" ангеза шавад. Барои ин, мо метавонем истифода барем .
сессия_нақши_нақши
Биёед хонем :
Ба механизми триггер низ тағирёбандаи конфигуратсия таъсир мерасонад Триггерҳое, ки бидуни ягон мушаххасоти иловагӣ фаъол карда мешаванд (ба таври нобаёнӣ) вақте ки нақши такрорӣ "пайдошавӣ" (аз рӯи нобаёнӣ) ё "маҳаллӣ" бошад, оташ мегиранд. Триггерҳо тавассути муайянкунӣ фаъол карда мешаванд
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 = ''; -- вернули в исходное состояние
Дигар усулҳоро медонед? Онҳоро дар шарҳҳо мубодила кунед.
Манбаъ: will.com
