CREATE TRIGGER
CREATE TRIGGER â ÑоздаÑÑ ÑÑиггеÑ
СинÑакÑиÑ
CREATE [ CONSTRAINT ] TRIGGERимÑ{ BEFORE | AFTER | INSTEAD OF } {ÑобÑÑие[ OR ... ] } ONимÑ_ÑаблиÑÑ[ FROMÑÑÑлаÑÑаÑÑÑ_ÑаблиÑа] [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ] [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN (ÑÑловие) ] EXECUTE PROCEDUREимÑ_ÑÑнкÑии(аÑгÑменÑÑ) ÐдеÑÑ Ð´Ð¾Ð¿ÑÑкаеÑÑÑÑобÑÑие: INSERT UPDATE [ OFимÑ_ÑÑолбÑа[, ... ] ] DELETE TRUNCATE
ÐпиÑание
CREATE TRIGGER ÑоздаÑÑ Ð½Ð¾Ð²Ñй ÑÑиггеÑ. ТÑÐ¸Ð³Ð³ÐµÑ Ð±ÑÐ´ÐµÑ ÑвÑзан Ñ Ñказанной ÑаблиÑей, пÑедÑÑавлением или ÑÑоÑонней ÑаблиÑей и бÑÐ´ÐµÑ Ð²ÑполнÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð½ÑÑ ÑÑнкÑÐ¸Ñ Ð¸Ð¼Ñ_ÑÑнкÑии пÑи опÑеделÑннÑÑ
ÑобÑÑиÑÑ
.
ТÑÐ¸Ð³Ð³ÐµÑ Ð¼Ð¾Ð¶Ð½Ð¾ наÑÑÑоиÑÑ Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑÑабаÑÑвал до опеÑаÑии Ñо ÑÑÑокой (до пÑовеÑки огÑаниÑений и попÑÑки вÑполниÑÑ INSERT, UPDATE или DELETE) или поÑле ÐµÑ Ð·Ð°Ð²ÐµÑÑÐµÐ½Ð¸Ñ (поÑле пÑовеÑки огÑаниÑений и вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ INSERT, UPDATE или DELETE), либо вмеÑÑо опеÑаÑии (пÑи добавлении, изменении и Ñдалении ÑÑÑок в пÑедÑÑавлении). ÐÑли ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð´Ð¾ или вмеÑÑо ÑобÑÑиÑ, он Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑопÑÑÑиÑÑ Ð¾Ð¿ÐµÑаÑÐ¸Ñ Ñ ÑекÑÑей ÑÑÑокой, либо измениÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑемÑÑ ÑÑÑÐ¾ÐºÑ (ÑолÑко Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑий INSERT и UPDATE). ÐÑли ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð¿Ð¾Ñле ÑобÑÑиÑ, он «видиÑ» вÑе изменениÑ, вклÑÑÐ°Ñ ÑезÑлÑÑÐ°Ñ Ð´ÐµÐ¹ÑÑÐ²Ð¸Ñ Ð´ÑÑгиÑ
ÑÑиггеÑов.
ТÑÐ¸Ð³Ð³ÐµÑ Ñ Ð¿Ð¾Ð¼ÐµÑкой FOR EACH ROW вÑзÑваеÑÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, изменÑемой в пÑоÑеÑÑе опеÑаÑии. ÐапÑимеÑ, опеÑаÑÐ¸Ñ DELETE, ÑдалÑÑÑÐ°Ñ 10 ÑÑÑок, пÑиведÑÑ Ðº ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð²ÑеÑ
ÑÑиггеÑов ON DELETE в Ñелевом оÑноÑении 10 Ñаз подÑÑд, по Ð¾Ð´Ð½Ð¾Ð¼Ñ ÑÐ°Ð·Ñ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑдалÑемой ÑÑÑоки. ТÑÐ¸Ð³Ð³ÐµÑ Ñ Ð¿Ð¾Ð¼ÐµÑкой FOR EACH STATEMENT, напÑоÑив, вÑзÑваеÑÑÑ ÑолÑко один Ñаз Ð´Ð»Ñ ÐºÐ¾Ð½ÐºÑеÑной опеÑаÑии, вне завиÑимоÑÑи Ð¾Ñ Ñого, как много ÑÑÑок она изменила (в ÑаÑÑноÑÑи, пÑи вÑполнении опеÑаÑии, изменÑÑÑей Ð½Ð¾Ð»Ñ ÑÑÑок, вÑÑ Ñавно бÑдÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ Ð²Ñе ÑÑиггеÑÑ FOR EACH STATEMENT). ÐамеÑÑÑе, ÑÑо пÑи вÑполнении INSERT Ñ Ð¿Ñедложением ON CONFLICT DO UPDATE ÑÑабоÑаÑÑ Ð¾Ð±Ð° ÑÑиггеÑа ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑов, Ð´Ð»Ñ INSERT и Ð´Ð»Ñ UPDATE.
ТÑиггеÑÑ, ÑÑабаÑÑваÑÑие в Ñежиме INSTEAD OF, Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ñ FOR EACH ROW и могÑÑ Ð±ÑÑÑ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ñ ÑолÑко Ð´Ð»Ñ Ð¿ÑедÑÑавлений. ТÑиггеÑÑ BEFORE и AFTER Ð´Ð»Ñ Ð¿ÑедÑÑавлений Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¿Ð¾Ð¼ÐµÑÐµÐ½Ñ FOR EACH STATEMENT.
ÐÑоме Ñого, ÑÑиггеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ опÑеделиÑÑ Ð¸ Ð´Ð»Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ TRUNCATE, но ÑолÑко Ñипа FOR EACH STATEMENT.
Ð ÑледÑÑÑей ÑаблиÑе пеÑеÑиÑлÑÑÑÑÑ ÑÐ¸Ð¿Ñ ÑÑиггеÑов, коÑоÑÑе могÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð´Ð»Ñ ÑаблиÑ, пÑедÑÑавлений и ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑаблиÑ:
| Ðогда | СобÑÑие | Ðа ÑÑовне ÑÑÑок | Ðа ÑÑовне опеÑаÑоÑа |
|---|---|---|---|
BEFORE | INSERT/UPDATE/DELETE | ТаблиÑÑ Ð¸ ÑÑоÑонние ÑаблиÑÑ | ТаблиÑÑ, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑÑоÑонние ÑаблиÑÑ |
TRUNCATE | â | ТаблиÑÑ | |
AFTER | INSERT/UPDATE/DELETE | ТаблиÑÑ Ð¸ ÑÑоÑонние ÑаблиÑÑ | ТаблиÑÑ, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸ ÑÑоÑонние ÑаблиÑÑ |
TRUNCATE | â | ТаблиÑÑ | |
INSTEAD OF | INSERT/UPDATE/DELETE | ÐÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ | â |
TRUNCATE | â | â |
ÐÑоме Ñого, в опÑеделении ÑÑиггеÑа можно ÑказаÑÑ Ð»Ð¾Ð³Ð¸ÑеÑкое ÑÑловие WHEN, коÑоÑое опÑеделиÑ, вÑзÑваÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð¸Ð»Ð¸ неÑ. Ð ÑÑиггеÑаÑ
на ÑÑовне ÑÑÑок ÑÑÐ»Ð¾Ð²Ð¸Ñ WHEN могÑÑ Ð¿ÑовеÑÑÑÑ ÑÑаÑÑе и/или новÑе знаÑÐµÐ½Ð¸Ñ ÑÑолбÑов в ÑÑÑоке. ТÑиггеÑÑ Ð½Ð° ÑÑовне опеÑаÑоÑа Ñак же могÑÑ ÑодеÑжаÑÑ ÑÑловие WHEN, Ñ
оÑÑ Ð´Ð»Ñ Ð½Ð¸Ñ
ÑÑо не ÑÑÐ¾Ð»Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð¾, Ñак как в ÑÑом ÑÑловии нелÑÐ·Ñ ÑÑÑлаÑÑÑÑ Ð½Ð° какие-либо знаÑÐµÐ½Ð¸Ñ Ð² ÑаблиÑе.
ÐÑли Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑобÑÑÐ¸Ñ Ð¾Ð¿Ñеделено неÑколÑко ÑÑиггеÑов одного Ñипа, они бÑдÑÑ ÑÑабаÑÑваÑÑ Ð² алÑавиÑном поÑÑдке Ð¸Ñ Ð¸Ð¼Ñн.
Ðогда ÑказÑваеÑÑÑ Ð¿Ð°ÑамеÑÑ CONSTRAINT, ÑÑа команда ÑоздаÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð¾Ð³ÑаниÑениÑ. Ðн подобен обÑÑнÑм ÑÑиггеÑам, но оÑлиÑаеÑÑÑ Ñем, ÑÑо вÑÐµÐ¼Ñ ÐµÐ³Ð¾ ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ измениÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ SET CONSTRAINTS. ТÑиггеÑÑ Ð¾Ð³ÑаниÑений Ð´Ð¾Ð»Ð¶Ð½Ñ ÑабоÑаÑÑ Ð² Ñежиме AFTER ROW. Ðни могÑÑ ÑÑабаÑÑваÑÑ Ð»Ð¸Ð±Ð¾ в конÑе опеÑаÑоÑа, вÑзвавÑего Ñелевое ÑобÑÑие, либо в конÑе ÑодеÑжаÑей его ÑÑанзакÑии; в поÑледнем ÑлÑÑае они назÑваÑÑÑÑ Ð¾ÑложеннÑми. СÑабаÑÑвание ожидаÑÑего оÑложенного ÑÑиггеÑа можно вÑзваÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾, воÑполÑзовавÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð¾Ð¹ SET CONSTRAINTS. ÐÑедполагаеÑÑÑ, ÑÑо ÑÑиггеÑÑ Ð¾Ð³ÑаниÑений бÑдÑÑ Ð³ÐµÐ½ÐµÑиÑоваÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ñи наÑÑÑении огÑаниÑений.
SELECT не изменÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑÑÑоки, поÑÑÐ¾Ð¼Ñ ÑоздаваÑÑ ÑÑиггеÑÑ Ð´Ð»Ñ SELECT нелÑзÑ. Ð ÑлÑÑае подобной поÑÑебноÑÑи бÑдÑÑ Ð±Ð¾Ð»ÐµÐµ ÑмеÑÑÐ½Ñ Ð¿Ñавила и пÑедÑÑавлениÑ.
Ðа дополниÑелÑнÑми ÑведениÑми о ÑÑиггеÑÐ°Ñ Ð¾Ð±ÑаÑиÑеÑÑ Ðº Ðлаве 35.
ÐаÑамеÑÑÑ
имÑÐмÑ, назнаÑаемое Ð½Ð¾Ð²Ð¾Ð¼Ñ ÑÑиггеÑÑ. ÐÑо Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ лÑбого дÑÑгого ÑÑиггеÑа в ÑÑой же ÑаблиÑе. ÐÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑÑ ÐµÐ¼Ð¾Ð¹ â ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ð°ÑледÑÐµÑ ÑÑ ÐµÐ¼Ñ Ð¾Ñ Ñвоей ÑаблиÑÑ. ÐÐ»Ñ ÑÑиггеÑов огÑаниÑений ÑÑо Ð¸Ð¼Ñ Ñакже иÑполÑзÑеÑÑÑ, когда ÑÑебÑеÑÑÑ ÑкоÑÑекÑиÑоваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑиггеÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
SET CONSTRAINTS.BEFOREAFTERINSTEAD OFÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑзÑваÑÑÑÑ Ð´Ð¾, поÑле или вмеÑÑо ÑобÑÑиÑ. ÐÐ»Ñ ÑÑиггеÑа огÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ ÑолÑко
AFTER.ÑобÑÑиеÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð´Ð½Ð¾ из знаÑений:
INSERT,UPDATE,DELETEилиTRUNCATE; ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾Ð¿ÑеделÑÐµÑ ÑобÑÑие, пÑи коÑоÑом бÑÐ´ÐµÑ ÑÑабаÑÑваÑÑ ÑÑиггеÑ. ÐеÑколÑко ÑобÑÑий можно ÑказаÑÑ, добавив Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ ÑловоOR.ÐÐ»Ñ ÑобÑÑий
UPDATEможно ÑказаÑÑ ÑпиÑок ÑÑолбÑов, иÑполÑзÑÑ ÑакÑÑ Ð·Ð°Ð¿Ð¸ÑÑ:UPDATE OF
имÑ_ÑÑолбÑа1[,имÑ_ÑÑолбÑа2... ]Такой ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабоÑаеÑ, ÑолÑко еÑли в Ñказанном в Ñелевой команде
UPDATEÑпиÑке ÑÑолбÑов окажеÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм один из пеÑеÑиÑленнÑÑ .ÐÐ»Ñ ÑобÑÑий
INSTEAD OF UPDATEÑпиÑок ÑÑолбÑов задаÑÑ Ð½ÐµÐ»ÑзÑ.имÑ_ÑаблиÑÑÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑаблиÑÑ, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÑоÑонней ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¿ÑедназнаÑен ÑÑиггеÑ.
ÑÑÑлаÑÑаÑÑÑ_ÑаблиÑаÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) дÑÑгой ÑаблиÑÑ, на коÑоÑÑÑ ÑÑÑлаеÑÑÑ Ð¾Ð³ÑаниÑение. Ðно иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð³ÑаниÑений внеÑнего клÑÑа и не ÑекомендÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑного пÑименениÑ. ÐÑо Ñказание допÑÑкаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑов огÑаниÑений.
DEFERRABLENOT DEFERRABLEINITIALLY IMMEDIATEINITIALLY DEFERREDÐÑÐµÐ¼Ñ ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑиггеÑа по ÑмолÑаниÑ. ÐодÑобнее возможнÑе ваÑианÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² докÑменÑаÑии CREATE TABLE. ÐÑо Ñказание допÑÑкаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑов огÑаниÑений.
FOR EACH ROWFOR EACH STATEMENTÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ пÑоÑедÑÑа ÑÑиггеÑа ÑÑабаÑÑваÑÑ Ð¾Ð´Ð¸Ð½ Ñаз Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, либо Ð´Ð»Ñ SQL-опеÑаÑоÑа. ÐÑли не Ñказано ниÑего, подÑазÑмеваеÑÑÑ
FOR EACH STATEMENT(Ð´Ð»Ñ Ð¾Ð¿ÐµÑаÑоÑа). ÐÐ»Ñ ÑÑиггеÑов огÑаниÑений можно ÑказаÑÑ ÑолÑкоFOR EACH ROW.ÑÑловиеÐогиÑеÑкое вÑÑажение, опÑеделÑÑÑее, бÑÐ´ÐµÑ Ð»Ð¸ вÑполнÑÑÑÑÑ ÑÑнкÑÐ¸Ñ ÑÑиггеÑа. ÐÑли Ð´Ð»Ñ ÑÑиггеÑа задано Ñказание
WHEN, ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ, ÑолÑко когдаÑÑловиевозвÑаÑаеÑtrue. Ð ÑÑиггеÑаÑFOR EACH ROWÑÑловиеWHENÐ¼Ð¾Ð¶ÐµÑ ÑÑÑлаÑÑÑÑ Ð½Ð° знаÑÐµÐ½Ð¸Ñ ÑÑолбÑа в ÑÑаÑой и/или новой ÑÑÑоке, в видеOLD.иимÑ_ÑÑолбÑаNEW., ÑооÑвеÑÑÑвенно. РазÑмееÑÑÑ, ÑÑиггеÑÑимÑ_ÑÑолбÑаINSERTне могÑÑ ÑÑÑлаÑÑÑÑ Ð½Ð°OLD, а ÑÑиггеÑÑDELETEне могÑÑ ÑÑÑлаÑÑÑÑ Ð½Ð°NEW.ТÑиггеÑÑ
INSTEAD OFне поддеÑживаÑÑ ÑÑловиÑWHEN.РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð²ÑÑажениÑ
WHENне могÑÑ ÑодеÑжаÑÑ Ð¿Ð¾Ð´Ð·Ð°Ð¿ÑоÑÑ.УÑÑиÑе, ÑÑо Ð´Ð»Ñ ÑÑиггеÑов огÑаниÑений вÑÑиÑление ÑÑловиÑ
WHENне оÑкладÑваеÑÑÑ, а вÑполнÑеÑÑÑ Ð½ÐµÐ¼ÐµÐ´Ð»ÐµÐ½Ð½Ð¾ поÑле опеÑаÑии, изменÑÑÑей ÑÑÑоки. ÐÑли ÑезÑлÑÑÐ°Ñ ÑÑÐ»Ð¾Ð²Ð¸Ñ â ложÑ, Ñам ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ðµ оÑкладÑваеÑÑÑ Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑего вÑполнениÑ.имÑ_ÑÑнкÑииÐÐ°Ð´Ð°Ð½Ð½Ð°Ñ Ð¿Ð¾Ð»ÑзоваÑелем ÑÑнкÑиÑ, обÑÑÐ²Ð»ÐµÐ½Ð½Ð°Ñ ÐºÐ°Ðº ÑÑнкÑÐ¸Ñ Ð±ÐµÐ· аÑгÑменÑов и возвÑаÑаÑÑÐ°Ñ Ñип
trigger, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ñи ÑÑабаÑÑвании ÑÑиггеÑа.аÑгÑменÑÑÐеобÑзаÑелÑнÑй ÑпиÑок аÑгÑменÑов ÑеÑез запÑÑÑÑ, коÑоÑÑе бÑдÑÑ Ð¿ÐµÑÐµÐ´Ð°Ð½Ñ ÑÑнкÑии пÑи ÑÑабаÑÑвании ÑÑиггеÑа. РкаÑеÑÑве аÑгÑменÑов ÑÑнкÑии пеÑедаÑÑÑÑ ÑÑÑоковÑе конÑÑанÑÑ. Ð Ñ Ð¾ÑÑ Ð² ÑÑом ÑпиÑке можно запиÑаÑÑ Ð¸ пÑоÑÑÑе имена или ÑиÑловÑе конÑÑанÑÑ, они Ñоже бÑдÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² ÑÑÑоки. ÐоÑÑдок обÑаÑÐµÐ½Ð¸Ñ Ðº Ñаким аÑгÑменÑам в ÑÑнкÑии ÑÑиггеÑа Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑнÑÑ Ð°ÑгÑменÑов, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ ÑледÑÐµÑ ÑÑоÑниÑÑ Ð² опиÑании ÑзÑка ÑеализаÑии ÑÑой ÑÑнкÑии.
ÐамеÑаниÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑиггеÑ, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво TRIGGER Ð´Ð»Ñ ÑÑой ÑаблиÑÑ. Также полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво EXECUTE Ð´Ð»Ñ ÑÑиггеÑной ÑÑнкÑии.
ÐÐ»Ñ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑиггеÑа пÑименÑеÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð° DROP TRIGGER.
ТÑÐ¸Ð³Ð³ÐµÑ Ð´Ð»Ñ Ð¸Ð·Ð±ÑаннÑÑ
ÑÑолбÑов (опÑеделÑннÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ UPDATE OF ) бÑÐ´ÐµÑ ÑÑабаÑÑваÑÑ, когда его ÑÑолбÑÑ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² каÑеÑÑве ÑелевÑÑ
в ÑпиÑке имÑ_ÑÑолбÑаSET ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE. ÐзменениÑ, вноÑимÑе в ÑÑÑоки ÑÑиггеÑами BEFORE UPDATE, пÑи ÑÑом не ÑÑиÑÑваÑÑÑÑ, поÑÑÐ¾Ð¼Ñ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÑÑолбÑов можно измениÑÑ Ñак, ÑÑо ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ðµ ÑÑабоÑаеÑ. РнаобоÑоÑ, пÑи вÑполнении ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE ... SET x = x ... ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð»Ñ ÑÑолбÑа x ÑÑабоÑаеÑ, Ñ
оÑÑ Ð·Ð½Ð°Ñение ÑÑолбÑа не менÑеÑÑÑ.
ÐекоÑоÑÑе обÑие задаÑи можно ÑеÑиÑÑ Ñ Ð¿Ñименением вÑÑÑоеннÑÑ ÑÑиггеÑнÑÑ ÑÑнкÑий, обойдÑÑÑ Ð±ÐµÐ· напиÑÐ°Ð½Ð¸Ñ ÑобÑÑвенного кода; Ñм. Раздел 9.27.
Ð ÑÑиггеÑе BEFORE ÑÑловие WHEN вÑÑиÑлÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед возможнÑм вÑзовом ÑÑнкÑии, поÑÑÐ¾Ð¼Ñ Ð¿ÑовеÑка WHEN ÑÑÑеÑÑвенно не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¿ÑовеÑки Ñого же ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð² наÑале ÑÑнкÑии ÑÑиггеÑа. Ð ÑаÑÑноÑÑи, ÑÑÑиÑе, ÑÑо ÑÑÑока NEW, коÑоÑÑÑ Ð²Ð¸Ð´Ð¸Ñ Ð¾Ð³ÑаниÑение, ÑодеÑÐ¶Ð¸Ñ ÑекÑÑие знаÑениÑ, возможно изменÑннÑе пÑедÑдÑÑими ÑÑиггеÑами. ÐÑоме Ñого, в ÑÑиггеÑе BEFORE ÑÑловие WHEN не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑÑÑÑ ÑиÑÑемнÑе ÑÑолбÑÑ Ð² ÑÑÑоке NEW (напÑимеÑ, oid), Ñак как они еÑÑ Ð½Ðµ ÑÑÑановленÑ.
Ð ÑÑиггеÑе AFTER ÑÑловие WHEN пÑовеÑÑеÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑоки, и еÑли оно вÑполнÑеÑÑÑ, ÑобÑÑие запоминаеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð²ÑзваÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð² конÑе опеÑаÑоÑа. ÐÑли же Ð´Ð»Ñ ÑÑиггеÑа AFTER ÑÑловие WHEN не вÑполнÑеÑÑÑ, Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи запоминаÑÑ ÑобÑÑие Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑей обÑабоÑки или заново пеÑеÑиÑÑваÑÑ ÑÑÑÐ¾ÐºÑ Ð² конÑе опеÑаÑоÑа. ÐÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº знаÑиÑелÑÐ½Ð¾Ð¼Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов, изменÑÑÑиÑ
множеÑÑво ÑÑÑок, когда ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑабаÑÑваÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
из ниÑ
.
ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑабаÑÑваÑÑ, ÑолÑко еÑли опеÑаÑÐ¸Ñ Ñ Ð¿ÑедÑÑавлением обÑабаÑÑваеÑÑÑ ÑÑиггеÑом ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок INSTEAD OF. ÐÑли опеÑаÑÐ¸Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ð¿Ñавилом INSTEAD, Ñо вмеÑÑо иÑÑ
одного опеÑаÑоÑа, обÑаÑаÑÑегоÑÑ Ðº пÑедÑÑавлениÑ, вÑполнÑÑÑÑÑ Ñе опеÑаÑоÑÑ, ÑÑо генеÑиÑÑÐµÑ Ð¿Ñавило, поÑÑÐ¾Ð¼Ñ Ð²ÑзÑваÑÑÑÑ Ð±ÑдÑÑ ÑÑиггеÑÑ, ÑвÑзаннÑе Ñ ÑаблиÑами, к коÑоÑÑм обÑаÑаÑÑÑÑ ÑÑи заменÑÑÑие опеÑаÑоÑÑ. ÐналогиÑно, Ð´Ð»Ñ Ð°Ð²ÑомаÑиÑеÑки изменÑемого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñполнение опеÑаÑии ÑводиÑÑÑ Ðº пеÑепиÑÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа в виде опеÑаÑии Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ ÑаблиÑей пÑедÑÑавлениÑ, Ñак ÑÑо ÑÑабаÑÑваÑÑ Ð±ÑдÑÑ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ ÑаблиÑÑ.
Ð PostgreSQL до веÑÑии 7.3 обÑзаÑелÑно ÑÑебовалоÑÑ Ð¾Ð±ÑÑвлÑÑÑ ÑÑиггеÑнÑе ÑÑнкÑии, как возвÑаÑаÑÑие ÑикÑивнÑй Ñип opaque, а не trigger. ÐÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки загÑÑзки ÑÑаÑÑÑ
Ñайлов ÑкÑпоÑÑа ÐÐ, команда CREATE TRIGGER пÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ ÑÑнкÑии Ñ Ð¾Ð±ÑÑвленнÑм Ñипом ÑезÑлÑÑаÑа opaque, но пÑи ÑÑом вÑдаÑÑÑÑ Ð¿ÑедÑпÑеждение и Ñип ÑезÑлÑÑаÑа менÑеÑÑÑ Ð½Ð° trigger.
ÐÑимеÑÑ
ÐÑполнение ÑÑнкÑии check_account_update пеÑед лÑбÑм изменением ÑÑÑок в ÑаблиÑе accounts:
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
EXECUTE PROCEDURE check_account_update(); То же Ñамое, но ÑÑнкÑÐ¸Ñ ÑÑиггеÑа бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ, ÑолÑко еÑли ÑÑÐ¾Ð»Ð±ÐµÑ balance пÑиÑÑÑÑÑвÑÐµÑ Ð² ÑпиÑке ÑелевÑÑ
ÑÑолбÑов ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE:
CREATE TRIGGER check_update
BEFORE UPDATE OF balance ON accounts
FOR EACH ROW
EXECUTE PROCEDURE check_account_update(); Ð ÑÑом пÑимеÑе ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ, еÑли знаÑение ÑÑолбÑа balance в дейÑÑвиÑелÑноÑÑи изменилоÑÑ:
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
EXECUTE PROCEDURE check_account_update(); ÐÑзов ÑÑнкÑии, ведÑÑей жÑÑнал изменений в accounts, но ÑолÑко еÑли ÑÑо-Ñо изменилоÑÑ:
CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE PROCEDURE log_account_update(); ÐÑполнение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑÑнкÑии view_insert_row, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑÑавлÑÑÑ ÑÑÑоки в нижележаÑие ÑаблиÑÑ Ð¿ÑедÑÑавлениÑ:
CREATE TRIGGER view_insert
INSTEAD OF INSERT ON my_view
FOR EACH ROW
EXECUTE PROCEDURE view_insert_row();РРазделе 35.4 пÑиведÑн полнÑй пÑÐ¸Ð¼ÐµÑ ÑÑнкÑии ÑÑиггеÑа, напиÑанной на C.
СовмеÑÑимоÑÑÑ
ÐпеÑаÑÐ¾Ñ CREATE TRIGGER в Postgres Pro ÑеализÑÐµÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво возможноÑÑей, опиÑаннÑÑ
в ÑÑандаÑÑе SQL. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² нÑм оÑÑÑÑÑÑвÑÐµÑ ÑледÑÑÑÐ°Ñ ÑÑнкÑионалÑноÑÑÑ:
SQL позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ ÑÐ¸Ð½Ð¾Ð½Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑÑок «old» и «new» или ÑаблиÑ, коÑоÑÑе заÑем можно бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð² опÑеделении дейÑÑÐ²Ð¸Ñ ÑÑиггеÑа (напÑимеÑ,
CREATE TRIGGER ... ON имÑ_ÑаблиÑÑ REFERENCING OLD ROW AS некоÑоÑое_Ð¸Ð¼Ñ NEW ROW AS дÑÑгое_имÑ...). Postgres Pro позволÑÐµÑ Ð¿Ð¸ÑаÑÑ Ð¿ÑоÑедÑÑÑ ÑÑиггеÑов на ÑазлиÑнÑÑ ÑзÑÐºÐ°Ñ , Ñак ÑÑо Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ доÑÑÑпа к даннÑм завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑзÑка.Postgres Pro не позволÑÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑÑаÑой и новой ÑаблиÑе в ÑÑиггеÑÐ°Ñ Ð½Ð° ÑÑовне опеÑаÑоÑа, Ñ. е. к ÑаблиÑам, ÑодеÑжаÑим вÑе ÑÑаÑÑе и/или новÑе ÑÑÑоки, обознаÑаемÑе как
OLD TABLEиNEW TABLEв ÑÑандаÑÑе SQL.Postgres Pro позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð² каÑеÑÑве дейÑÑÐ²Ð¸Ñ ÑÑиггеÑа ÑолÑко ÑÑнкÑиÑ, опÑеделÑннÑÑ Ð¿Ð¾Ð»ÑзоваÑелем. СÑандаÑÑ Ð´Ð¾Ð¿ÑÑÐºÐ°ÐµÑ Ñакже вÑполнение ÑÑда дÑÑÐ³Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ SQL, напÑимеÑ,
CREATE TABLE. Ðднако ÑÑо огÑаниÑение неÑложно пÑеодолеÑÑ, Ñоздав полÑзоваÑелÑÑкÑÑ ÑÑнкÑиÑ, вÑполнÑÑÑÑÑ ÑÑебÑемÑе командÑ.
Ð ÑÑандаÑÑе SQL опÑеделено, ÑÑо неÑколÑко ÑÑиггеÑов Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑабаÑÑваÑÑ Ð¿Ð¾ поÑÑÐ´ÐºÑ ÑозданиÑ. Postgres Pro ÑпоÑÑдоÑÐ¸Ð²Ð°ÐµÑ Ð¸Ñ Ð¿Ð¾ именам, Ñак как ÑÑо бÑло пÑизнано более ÑдобнÑм.
Ð ÑÑандаÑÑе SQL опÑеделено, ÑÑо ÑÑиггеÑÑ BEFORE DELETE пÑи каÑкадном Ñдалении ÑÑабаÑÑваÑÑ Ð¿Ð¾Ñле завеÑÑÐµÐ½Ð¸Ñ ÐºÐ°Ñкадного DELETE. Ð Postgres Pro ÑÑиггеÑÑ BEFORE DELETE вÑегда ÑÑабаÑÑваÑÑ Ð¿ÐµÑед опеÑаÑией ÑдалениÑ, даже еÑли она каÑкаднаÑ. ÐÑо поведение вÑбÑано как более логиÑное. ÐÑÑ Ð¾Ð´Ð½Ð¾ оÑклонение Ð¾Ñ ÑÑандаÑÑа пÑоÑвлÑеÑÑÑ, когда ÑÑиггеÑÑ BEFORE, ÑÑабаÑÑваÑÑие в ÑезÑлÑÑаÑе ÑÑÑлоÑной опеÑаÑии, изменÑÑÑ ÑÑÑоки или не даÑÑ Ð²ÑполниÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑений или ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, не ÑоблÑдаÑÑиÑ
ÑÑÑлоÑнÑÑ ÑелоÑÑноÑÑÑ.
ÐозможноÑÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð½ÐµÑколÑко дейÑÑвий Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑиггеÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевого Ñлова OR â Ñеализованное в Postgres Pro ÑаÑÑиÑение ÑÑандаÑÑа SQL.
ÐозможноÑÑÑ Ð²ÑзÑваÑÑ ÑÑиггеÑÑ Ð´Ð»Ñ TRUNCATE â Ñеализованное в Postgres Pro ÑаÑÑиÑение ÑÑандаÑÑа SQL, как и возможноÑÑÑ Ð¾Ð¿ÑеделÑÑÑ ÑÑиггеÑÑ Ð½Ð° ÑÑовне опеÑаÑоÑа Ð´Ð»Ñ Ð¿ÑедÑÑавлений.
CREATE CONSTRAINT TRIGGER â Ñеализованное в Postgres Pro ÑаÑÑиÑение ÑÑандаÑÑа SQL.