38.1. ÐÐ±Ð·Ð¾Ñ Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼Ð° ÑабоÑÑ ÑÑиггеÑов ÑобÑÑий #
ТÑÐ¸Ð³Ð³ÐµÑ ÑобÑÑÐ¸Ñ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð²ÑÑкий Ñаз, когда в базе даннÑÑ
, в коÑоÑой он опÑеделÑн, пÑоиÑÑ
Ð¾Ð´Ð¸Ñ ÑвÑзанное Ñ Ð½Ð¸Ð¼ ÑобÑÑие. РнаÑÑоÑÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑÑÑ ÑледÑÑÑие ÑобÑÑиÑ: login, ddl_command_start, ddl_command_end, table_rewrite и sql_drop. ÐоддеÑжка дополниÑелÑнÑÑ
ÑобÑÑий Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð° в бÑдÑÑиÑ
вÑпÑÑкаÑ
.
38.1.1. login #
СобÑÑие login пÑоиÑÑ
одиÑ, когда аÑÑенÑиÑиÑиÑованнÑй полÑзоваÑÐµÐ»Ñ Ð²Ñ
Ð¾Ð´Ð¸Ñ Ð² ÑиÑÑемÑ. ÐÑбÑе оÑибки в пÑоÑедÑÑе ÑÑиггеÑа Ð´Ð»Ñ ÑÑого ÑобÑÑÐ¸Ñ Ð¼Ð¾Ð³ÑÑ Ð¿Ð¾Ð¼ÐµÑаÑÑ ÑÑпеÑÐ½Ð¾Ð¼Ñ Ð²Ñ
Ð¾Ð´Ñ Ð² ÑиÑÑемÑ. ТакиÑ
оÑибок можно избежаÑÑ, задав Ð´Ð»Ñ Ð¿Ð°ÑамеÑÑа event_triggers знаÑение false в ÑÑÑоке подклÑÑÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ Ñайле конÑигÑÑаÑии. ÐÑоме Ñого, можно пеÑезапÑÑÑиÑÑ ÑеÑÐ²ÐµÑ Ð² однополÑзоваÑелÑÑком Ñежиме (поÑколÑÐºÑ ÑÑиггеÑÑ ÑобÑÑий в ÑÑом Ñежиме оÑклÑÑенÑ). Ðа дополниÑелÑнÑми ÑведениÑми об однополÑзоваÑелÑÑком Ñежиме обÑаÑиÑеÑÑ Ðº ÑпÑавке по postgres. СобÑÑийнÑй ÑÑÐ¸Ð³Ð³ÐµÑ login Ñакже ÑÑабаÑÑÐ²Ð°ÐµÑ Ð½Ð° ÑезеÑвнÑÑ
ÑеÑвеÑаÑ
. Ðо избежание пÑоблем Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑением к ÑеÑвеÑам, ÑабоÑаÑÑие на ниÑ
ÑÑиггеÑÑ login не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð½Ð¸Ñего запиÑÑваÑÑ Ð² Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐÑоме Ñого, ÑекомендÑеÑÑÑ Ð¸Ð·Ð±ÐµÐ³Ð°ÑÑ Ð´Ð»Ð¸ÑелÑнÑÑ
запÑоÑов в ÑобÑÑийнÑÑ
ÑÑиггеÑаÑ
login. ÐбÑаÑиÑе внимание, ÑÑо оÑмена подклÑÑÐµÐ½Ð¸Ñ Ð² psql не оÑÐ¼ÐµÐ½Ð¸Ñ ÑекÑÑий ÑÑÐ¸Ð³Ð³ÐµÑ login.
ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÑÑиггеÑа ÑобÑÑÐ¸Ñ login пÑиведÑн в Разделе 38.5.
38.1.2. ddl_command_start #
СобÑÑие ddl_command_start пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед вÑполнением ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DDL. Рданном конÑекÑÑе командами DDL ÑÑиÑаÑÑÑÑ:
CREATEALTERDROPCOMMENTGRANTIMPORT FOREIGN SCHEMAREINDEXREFRESH MATERIALIZED VIEWREVOKESECURITY LABEL
СобÑÑие ddl_command_start Ñакже пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿ÐµÑед вÑполнением ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SELECT INTO, Ñак как она ÑавнознаÑна CREATE TABLE AS.
РкаÑеÑÑве иÑклÑÑÐµÐ½Ð¸Ñ ÑÑо ÑобÑÑие не ÑÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ DDL, напÑавленнÑÑ Ð½Ð° обÑие обÑекÑÑ:
Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ñоли (опÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñолей и ÑленÑÑво в ÑолÑÑ )
ÑаблиÑнÑе пÑоÑÑÑанÑÑва
пÑава на паÑамеÑÑÑ
ALTER SYSTEM
Ðно Ñакже не ÑÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´, напÑавленнÑÑ Ð½Ð° Ñами ÑÑиггеÑÑ ÑобÑÑий.
ÐÑовеÑка ÑÑÑеÑÑÐ²Ð¾Ð²Ð°Ð½Ð¸Ñ Ñелевого обÑекÑа до ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑобÑÑийного ÑÑиггеÑа не вÑполнÑеÑÑÑ.
38.1.3. ddl_command_end #
СобÑÑие ddl_command_end пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно поÑле вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñого же набоÑа команд, ÑÑо и Ð´Ð»Ñ ddl_command_start. ЧÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾Ð± опеÑаÑиÑÑ
DDL, повлÑкÑиÑ
пÑоизоÑедÑее ÑобÑÑие, вÑзовиÑе ÑÑнкÑÐ¸Ñ pg_event_trigger_ddl_commands(), возвÑаÑаÑÑÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво, из кода обÑабоÑÑика ÑобÑÑÐ¸Ñ ddl_command_end (Ñм. Раздел 9.30). ÐамеÑÑÑе, ÑÑо ÑÑÐ¾Ñ ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñле Ñого, как ÑÑи дейÑÑÐ²Ð¸Ñ Ð¸Ð¼ÐµÐ»Ð¸ меÑÑо (но до ÑикÑаÑии ÑÑанзакÑии), Ñак ÑÑо в ÑиÑÑемнÑÑ
каÑалогаÑ
можно ÑвидеÑÑ Ñже изменÑнное ÑоÑÑоÑние.
38.1.4. sql_drop #
СобÑÑие sql_drop пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед ÑобÑÑием ddl_command_end Ð´Ð»Ñ Ð»Ñбой опеÑаÑии, коÑоÑÐ°Ñ ÑдалÑÐµÑ Ð¾Ð±ÑекÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
. ÐбÑаÑиÑе внимание, ÑÑо кÑоме оÑевиднÑÑ
команд DROP некоÑоÑÑе ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ ALTER Ñакже могÑÑ Ð²ÑзÑваÑÑ ÑобÑÑие sql_drop.
ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ ÑпиÑка ÑдалÑннÑÑ
обÑекÑов иÑполÑзÑйÑе возвÑаÑаÑÑÑÑ Ð½Ð°Ð±Ð¾Ñ ÑÑÑок ÑÑнкÑÐ¸Ñ pg_event_trigger_dropped_objects() в ÑÑиггеÑе ÑобÑÑÐ¸Ñ sql_drop (Ñм. Раздел 9.30). ÐбÑаÑиÑе внимание, ÑÑо ÑÑÐ¸Ð³Ð³ÐµÑ Ð²ÑполнÑеÑÑÑ Ð¿Ð¾Ñле ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов из ÑÐ°Ð±Ð»Ð¸Ñ ÑиÑÑемного каÑалога, поÑÑÐ¾Ð¼Ñ Ð¸Ñ
невозможно болÑÑе ÑвидеÑÑ.
38.1.5. table_rewrite #
СобÑÑие table_rewrite пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед Ñем, как ÑаблиÑа бÑÐ´ÐµÑ Ð¿ÐµÑезапиÑана в ÑезÑлÑÑаÑе опÑеделÑннÑÑ
дейÑÑвий команд ALTER TABLE и ALTER TYPE. ХоÑÑ Ð¿ÐµÑезапиÑÑ ÑаблиÑÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ñзвана и дÑÑгими ÑпÑавлÑÑÑими опеÑаÑоÑами, в ÑаÑÑноÑÑи CLUSTER и VACUUM, ÑобÑÑие table_rewrite Ð´Ð»Ñ Ð½Ð¸Ñ
не вÑзÑваеÑÑÑ. ÐайÑи OID ÑаблиÑÑ, коÑоÑÐ°Ñ Ð±Ñла пеÑезапиÑана, можно Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÑÑнкÑии pg_event_trigger_table_rewrite_oid(). ЧÑÐ¾Ð±Ñ ÑзнаÑÑ Ð¿ÑиÑÐ¸Ð½Ñ (пÑиÑинÑ) пеÑезапиÑи, иÑполÑзÑйÑе ÑÑнкÑÐ¸Ñ pg_event_trigger_table_rewrite_reason() (Ñм. Раздел 9.30).
38.1.6. СобÑÑийнÑе ÑÑиггеÑÑ Ð² пÑеÑваннÑÑ ÑÑанзакÑиÑÑ #
ТÑиггеÑÑ ÑобÑÑий (как и пÑоÑие ÑÑнкÑии) не могÑÑ Ð²ÑполнÑÑÑÑÑ Ð² пÑеÑванной ÑÑанзакÑии. ÐоÑÑомÑ, еÑли команда DDL завеÑÑаеÑÑÑ Ð¾Ñибкой, ÑооÑвеÑÑÑвÑÑÑие ÑÑиггеÑÑ ddl_command_end не ÑÑабоÑаÑÑ. РнаобоÑоÑ, еÑли ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_end завеÑÑилÑÑ Ñ Ð¾Ñибкой, поÑледÑÑÑие ÑÑиггеÑÑ ÑобÑÑий не ÑÑабоÑаÑÑ, Ñак же как и Ñама команда не бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ. ÐоÑ
ожим обÑазом, еÑли ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_end завеÑÑиÑÑÑ Ð¾Ñибкой, дейÑÑвие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ DDL бÑÐ´ÐµÑ Ð¾Ñменено, как ÑÑо пÑоиÑÑ
Ð¾Ð´Ð¸Ñ Ð¿Ñи возникновении оÑибки внÑÑÑи ÑÑанзакÑии.
38.1.7. Создание ÑобÑÑийнÑÑ ÑÑиггеÑов #
ÐÐ»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑÑиггеÑа ÑобÑÑÐ¸Ñ Ð¸ÑполÑзÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° CREATE EVENT TRIGGER. ÐÑедваÑиÑелÑно нÑжно ÑоздаÑÑ ÑÑнкÑиÑ, Ñо ÑпеÑиалÑнÑм возвÑаÑаемÑм Ñипом event_trigger. ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð½Ðµ обÑзана возвÑаÑаÑÑ Ð·Ð½Ð°Ñение (и Ð¼Ð¾Ð¶ÐµÑ Ð½Ðµ возвÑаÑаÑÑ). ÐозвÑаÑаемÑй Ñип ÑлÑÐ¶Ð¸Ñ Ð»Ð¸ÑÑ Ñказанием на Ñо, ÑÑо ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¸Ð· ÑÑиггеÑа ÑобÑÑиÑ.
ÐÑли еÑÑÑ Ð½ÐµÑколÑко ÑÑиггеÑов на одно и Ñо же ÑобÑÑие, Ñо они бÑдÑÑ Ð²ÑзÑваÑÑÑÑ Ð² алÑавиÑном поÑÑдке по имени ÑÑиггеÑа.
РопÑеделении ÑÑиггеÑа можно иÑполÑзоваÑÑ ÑÑловие WHEN, ÑÑобÑ, напÑимеÑ, ÑÑÐ¸Ð³Ð³ÐµÑ ddl_command_start ÑÑабаÑÑвал ÑолÑко Ð´Ð»Ñ Ð¾ÑделÑнÑÑ
команд, коÑоÑÑе нÑжно пеÑеÑ
ваÑиÑÑ. ТÑиггеÑÑ ÑобÑÑий ÑаÑÑо иÑполÑзÑÑÑÑÑ Ð´Ð»Ñ Ð¾Ð³ÑаниÑÐµÐ½Ð¸Ñ Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½Ð° DDL-команд, доÑÑÑпнÑÑ
полÑзоваÑелÑм.