CREATE TRIGGER
CREATE TRIGGER â ÑоздаÑÑ ÑÑиггеÑ
СинÑакÑиÑ
CREATE [ CONSTRAINT ] TRIGGERимÑ{ BEFORE | AFTER | INSTEAD OF } {ÑобÑÑие[ OR ... ] } ONимÑ_ÑаблиÑÑ[ FROMÑÑÑлаÑÑаÑÑÑ_ÑаблиÑа] [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ] [ REFERENCING { { OLD | NEW } TABLE [ AS ]имÑ_пеÑÐµÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾_оÑноÑениÑ} [ ... ] ] [ FOR [ EACH ] { ROW | STATEMENT } ] [ WHEN (ÑÑловие) ] EXECUTE { FUNCTION | 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).
ТÑиггеÑÑ, ÑÑабаÑÑваÑÑие в Ñежиме 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. ÐÑедполагаеÑÑÑ, ÑÑо ÑÑиггеÑÑ Ð¾Ð³ÑаниÑений бÑдÑÑ Ð³ÐµÐ½ÐµÑиÑоваÑÑ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð¿Ñи наÑÑÑении огÑаниÑений.
Ðогда ÑказÑваеÑÑÑ REFERENCING, Ð´Ð»Ñ ÑÑиггеÑа ÑобиÑаÑÑÑÑ Ð¿ÐµÑеÑ
однÑе оÑноÑениÑ, пÑедÑÑавлÑÑÑие Ñобой множеÑÑва ÑÑÑок, вклÑÑаÑÑие вÑе ÑÑÑоки, коÑоÑÑе бÑли добавленÑ, ÑÐ´Ð°Ð»ÐµÐ½Ñ Ð¸Ð»Ð¸ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÑекÑÑим опеÑаÑоÑом SQL. ÐÑо позволÑÐµÑ ÑÑиггеÑÑ Ð½Ð°Ð±Ð»ÑдаÑÑ Ð¾Ð±ÑÑÑ ÐºÐ°ÑÑÐ¸Ð½Ñ Ñого, ÑÑо Ñделал опеÑаÑоÑ, а не ÑолÑко Ð¾Ð´Ð½Ñ ÑÑÑÐ¾ÐºÑ Ð·Ð° дÑÑгой. ÐÑо Ñказание допÑÑкаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑа AFTER, не ÑвлÑÑÑегоÑÑ ÑÑиггеÑом огÑаниÑениÑ; кÑоме Ñого, еÑли ÑÑо ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð»Ñ UPDATE, Ñ Ð½ÐµÐ³Ð¾ должен оÑÑÑÑÑÑвоваÑÑ ÑпиÑок имÑн_ÑÑолбÑов. Указание OLD TABLE Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¾ ÑолÑко один Ñаз и ÑолÑко Ð´Ð»Ñ ÑÑиггеÑа, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑÑабаÑÑваÑÑ Ð¿Ñи UPDATE или DELETE; оно ÑоздаÑÑ Ð¿ÐµÑеÑ
одное оÑноÑение, ÑодеÑжаÑее обÑазÑ-до-Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑÑÑок, модиÑиÑиÑованнÑÑ
или ÑдалÑннÑÑ
опеÑаÑоÑом. Указание NEW TABLE, подобнÑм обÑазом, Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð´Ð°Ð½Ð¾ ÑолÑко ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð¸ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑа, коÑоÑÑй Ð¼Ð¾Ð¶ÐµÑ ÑÑабаÑÑваÑÑ Ð´Ð»Ñ UPDATE или INSERT; оно ÑоздаÑÑ Ð¿ÐµÑеÑ
одное оÑноÑение, ÑодеÑжаÑее обÑазÑ-поÑле-Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²ÑеÑ
ÑÑÑок, модиÑиÑиÑованнÑÑ
или добавленнÑÑ
опеÑаÑоÑом.
SELECT не изменÑÐµÑ Ð½Ð¸ÐºÐ°ÐºÐ¸Ðµ ÑÑÑоки, поÑÑÐ¾Ð¼Ñ ÑоздаваÑÑ ÑÑиггеÑÑ Ð´Ð»Ñ SELECT нелÑзÑ. ÐÐ»Ñ ÑеÑÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ñ, в коÑоÑÑÑ
ÑÑебÑÑÑÑÑ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñе ÑÑиггеÑÑ, могÑÑ Ð¿Ð¾Ð´Ð¾Ð¹Ñи пÑавила или пÑедÑÑавлениÑ.
Ðа дополниÑелÑнÑми ÑведениÑми о ÑÑиггеÑÐ°Ñ Ð¾Ð±ÑаÑиÑеÑÑ Ðº Ðлаве 39.
ÐаÑамеÑÑÑ
имÑÐмÑ, назнаÑаемое Ð½Ð¾Ð²Ð¾Ð¼Ñ ÑÑиггеÑÑ. ÐÑо Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ лÑбого дÑÑгого ÑÑиггеÑа в ÑÑой же ÑаблиÑе. ÐÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑÑ ÐµÐ¼Ð¾Ð¹ â ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ð°ÑледÑÐµÑ ÑÑ ÐµÐ¼Ñ Ð¾Ñ Ñвоей ÑаблиÑÑ. ÐÐ»Ñ ÑÑиггеÑов огÑаниÑений ÑÑо Ð¸Ð¼Ñ Ñакже иÑполÑзÑеÑÑÑ, когда ÑÑебÑеÑÑÑ ÑкоÑÑекÑиÑоваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑиггеÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ
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. ÐÑо Ñказание допÑÑкаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑов огÑаниÑений.
REFERENCINGÐÑо клÑÑевое Ñлово непоÑÑедÑÑвенно пÑедÑеÑÑвÑÐµÑ Ð¾Ð±ÑÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или двÑÑ Ð¸Ð¼Ñн, по коÑоÑÑм можно бÑÐ´ÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº пеÑÐµÑ Ð¾Ð´Ð½Ñм оÑноÑениÑми, обÑазÑемÑм пÑи вÑполнении Ñелевого опеÑаÑоÑа.
OLD TABLENEW 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, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿Ñи ÑÑабаÑÑвании ÑÑиггеÑа.Ð ÑинÑакÑиÑе
CREATE TRIGGERклÑÑевÑе ÑловаFUNCTIONиPROCEDUREÑавнознаÑнÑ, но ÑказÑÐ²Ð°ÐµÐ¼Ð°Ñ ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° в лÑбом ÑлÑÑае бÑÑÑ ÑÑнкÑией, а не пÑоÑедÑÑой. ÐлÑÑевое ÑловоPROCEDUREздеÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаеÑÑÑ Ð¿Ð¾ иÑÑоÑиÑеÑким пÑиÑинам и ÑÑиÑаеÑÑÑ ÑÑÑаÑевÑим.аÑгÑменÑÑÐеобÑзаÑелÑнÑй ÑпиÑок аÑгÑменÑов ÑеÑез запÑÑÑÑ, коÑоÑÑе бÑдÑÑ Ð¿ÐµÑÐµÐ´Ð°Ð½Ñ ÑÑнкÑии пÑи ÑÑабаÑÑвании ÑÑиггеÑа. РкаÑеÑÑве аÑгÑменÑов ÑÑнкÑии пеÑедаÑÑÑÑ ÑÑÑоковÑе конÑÑанÑÑ. Ð Ñ Ð¾ÑÑ Ð² ÑÑом ÑпиÑке можно запиÑаÑÑ Ð¸ пÑоÑÑÑе имена или ÑиÑловÑе конÑÑанÑÑ, они Ñоже бÑдÑÑ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ñ Ð² ÑÑÑоки. ÐоÑÑдок обÑаÑÐµÐ½Ð¸Ñ Ðº Ñаким аÑгÑменÑам в ÑÑнкÑии ÑÑиггеÑа Ð¼Ð¾Ð¶ÐµÑ Ð¾ÑлиÑаÑÑÑÑ Ð¾Ñ Ð¾Ð±ÑÑнÑÑ Ð°ÑгÑменÑов, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ ÑледÑÐµÑ ÑÑоÑниÑÑ Ð² опиÑании ÑзÑка ÑеализаÑии ÑÑой ÑÑнкÑии.
ÐамеÑаниÑ
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ ÑÑиггеÑ, полÑзоваÑÐµÐ»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ имеÑÑ Ð¿Ñаво 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 не вÑполнÑеÑÑÑ, Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ
одимоÑÑи запоминаÑÑ ÑобÑÑие Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑей обÑабоÑки или заново пеÑеÑиÑÑваÑÑ ÑÑÑÐ¾ÐºÑ Ð² конÑе опеÑаÑоÑа. ÐÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº знаÑиÑелÑÐ½Ð¾Ð¼Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов, изменÑÑÑиÑ
множеÑÑво ÑÑÑок, когда ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑабаÑÑваÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ
из ниÑ
.
РнекоÑоÑÑÑ
ÑлÑÑаÑÑ
одна команда SQL Ð¼Ð¾Ð¶ÐµÑ Ð²ÑзÑваÑÑ ÑÑÐ°Ð·Ñ Ð½ÐµÑколÑкиÑ
видов ÑÑиггеÑов. ÐапÑимеÑ, INSERT Ñ Ð¿Ñедложением ON CONFLICT DO UPDATE Ð¼Ð¾Ð¶ÐµÑ Ð²ÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑии как добавлениÑ, Ñак и изменениÑ, Ñак ÑÑо она пÑи необÑ
одимоÑÑи бÑÐ´ÐµÑ Ð²ÑзÑваÑÑ ÑÑиггеÑÑ Ð¾Ð±Ð¾Ð¸Ñ
видов. ÐÑи ÑÑом пеÑеÑ
однÑе оÑноÑениÑ, пÑедоÑÑавлÑемÑе ÑÑиггеÑам, бÑдÑÑ ÑазнÑми в завиÑимоÑÑи Ð¾Ñ Ñипа ÑобÑÑиÑ; Ñо еÑÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ INSERT бÑÐ´ÐµÑ Ð²Ð¸Ð´ÐµÑÑ ÑолÑко добавленнÑе ÑÑÑоки, а ÑÑÐ¸Ð³Ð³ÐµÑ UPDATE â ÑолÑко изменÑннÑе.
ÐÐ·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑÑÑок, вÑзваннÑе дейÑÑвиÑми по обеÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи внеÑнего клÑÑа, напÑимеÑ, ON UPDATE CASCADE или ON DELETE SET NULL, ÑÑиÑаÑÑÑÑ ÑаÑÑÑÑ SQL-командÑ, вÑзвавÑей ÑÑи дейÑÑÐ²Ð¸Ñ (замеÑÑÑе, ÑÑо Ñакие дейÑÑÐ²Ð¸Ñ Ð½Ðµ могÑÑ Ð±ÑÑÑ Ð¾ÑложеннÑми). РзаÑÑагиваемой ÑаблиÑе бÑдÑÑ Ð²ÑÐ·Ð²Ð°Ð½Ñ ÑооÑвеÑÑÑвÑÑÑие ÑÑиггеÑÑ, и Ñаким обÑазом поÑвлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð²Ñзова ÑÑиггеÑов Ð´Ð»Ñ SQL-командÑ, не ÑооÑвеÑÑÑвÑÑÑей непоÑÑедÑÑвенно иÑ
ÑипÑ. РпÑоÑÑÑÑ
ÑиÑÑаÑиÑÑ
ÑÑиггеÑÑ, запÑаÑиваÑÑие пеÑеÑ
однÑе оÑноÑениÑ, бÑдÑÑ Ð²Ð¸Ð´ÐµÑÑ Ð²Ñе изменениÑ, пÑоизведÑннÑе в иÑ
ÑаблиÑе одной иÑÑ
одной командой SQL, в виде одного пеÑеÑ
одного оÑноÑениÑ. Ðднако Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑлÑÑаи, в коÑоÑÑÑ
пÑиÑÑÑÑÑвие ÑÑиггеÑа AFTER ROW, запÑаÑиваÑÑего пеÑеÑ
однÑе оÑноÑениÑ, пÑиведÑÑ Ðº ÑомÑ, ÑÑо опеÑаÑии Ð´Ð»Ñ Ð¾Ð±ÐµÑпеÑÐµÐ½Ð¸Ñ ÑелоÑÑноÑÑи внеÑнего клÑÑа, вÑзваннÑе одной SQL-командой, бÑдÑÑ ÑÐ°Ð·Ð´ÐµÐ»ÐµÐ½Ñ Ð½Ð° неÑколÑко ÑÑапов, и на каждом бÑдÑÑ Ñвои пеÑеÑ
однÑе оÑноÑениÑ. Ð ÑакиÑ
ÑлÑÑаÑÑ
вÑе ÑÑÑеÑÑвÑÑÑие ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа бÑдÑÑ ÑÑабаÑÑваÑÑ ÐµÐ´Ð¸Ð½Ð¾Ð¶Ð´Ñ Ð¿Ñи Ñоздании пеÑеÑ
одного оÑноÑениÑ, ÑÑо гаÑанÑиÑÑеÑ, ÑÑо ÑÑи ÑÑиггеÑÑ Ð±ÑдÑÑ Ð²Ð¸Ð´ÐµÑÑ ÐºÐ°Ð¶Ð´ÑÑ Ð¾Ð±ÑабаÑÑваемÑÑ ÑÑÑÐ¾ÐºÑ Ð² пеÑеÑ
одном оÑноÑении один и ÑолÑко один Ñаз.
ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð¿ÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑÑабаÑÑваÑÑ, ÑолÑко еÑли опеÑаÑÐ¸Ñ Ñ Ð¿ÑедÑÑавлением обÑабаÑÑваеÑÑÑ ÑÑиггеÑом ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок INSTEAD OF. ÐÑли опеÑаÑÐ¸Ñ Ð¾Ð±ÑабаÑÑваеÑÑÑ Ð¿Ñавилом INSTEAD, Ñо вмеÑÑо иÑÑ
одного опеÑаÑоÑа, обÑаÑаÑÑегоÑÑ Ðº пÑедÑÑавлениÑ, вÑполнÑÑÑÑÑ Ñе опеÑаÑоÑÑ, ÑÑо генеÑиÑÑÐµÑ Ð¿Ñавило, поÑÑÐ¾Ð¼Ñ Ð²ÑзÑваÑÑÑÑ Ð±ÑдÑÑ ÑÑиггеÑÑ, ÑвÑзаннÑе Ñ ÑаблиÑами, к коÑоÑÑм обÑаÑаÑÑÑÑ ÑÑи заменÑÑÑие опеÑаÑоÑÑ. ÐналогиÑно, Ð´Ð»Ñ Ð°Ð²ÑомаÑиÑеÑки изменÑемого пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñполнение опеÑаÑии ÑводиÑÑÑ Ðº пеÑепиÑÑÐ²Ð°Ð½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑа в виде опеÑаÑии Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ ÑаблиÑей пÑедÑÑавлениÑ, Ñак ÑÑо ÑÑабаÑÑваÑÑ Ð±ÑдÑÑ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ð¹ ÑаблиÑÑ.
ÐÑи Ñоздании ÑÑиггеÑа ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок Ð´Ð»Ñ ÑекÑиониÑованной ÑаблиÑÑ Ñакие же ÑÑиггеÑÑ Ð±ÑдÑÑ ÑÐ¾Ð·Ð´Ð°Ð½Ñ Ð²Ð¾ вÑеÑ
ÑÑÑеÑÑвÑÑÑиÑ
ÑекÑиÑÑ
ÑÑой ÑаблиÑÑ; иденÑиÑнÑе ÑÑиггеÑÑ Ð±ÑдÑÑ ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ñ Ð¸ в ÑекÑиÑÑ
, ÑоздаваемÑÑ
или пÑиÑоединÑемÑÑ
позже. Ð ÑлÑÑае оÑÑÐ¾ÐµÐ´Ð¸Ð½ÐµÐ½Ð¸Ñ ÑекÑии Ð¾Ñ ÑодиÑелÑÑкой ÑаблиÑÑ ÑозданнÑй в ÑекÑии ÑÑÐ¸Ð³Ð³ÐµÑ ÑдалÑеÑÑÑ. ÐÐ»Ñ ÑекÑиониÑованнÑÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑоздаваÑÑÑÑ ÑолÑко ÑÑиггеÑÑ AFTER.
ÐÑи изменении даннÑÑ
в ÑекÑиониÑованной ÑаблиÑе или ÑаблиÑе Ñ Ð¿Ð¾Ñомками ÑÑабаÑÑваÑÑ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа, ÑвÑзаннÑе Ñ Ñвно задейÑÑвованной ÑаблиÑей, но не ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа Ð´Ð»Ñ ÐµÑ ÑекÑий или доÑеÑниÑ
ÑаблиÑ. ТÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок, напÑоÑив, ÑÑабаÑÑваÑÑ Ð´Ð»Ñ ÑÑÑок в заÑÑагиваемÑÑ
ÑекÑиÑÑ
или доÑеÑниÑ
ÑаблиÑаÑ
, даже еÑли они Ñвно не пÑиÑÑÑÑÑвÑÑÑ Ð² запÑоÑе. ÐÑли ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑÐ¾Ð²Ð½Ñ Ð¾Ð¿ÐµÑаÑоÑа бÑл опÑеделÑн Ñ Ð¿ÐµÑеÑ
однÑми оÑноÑениÑми, названнÑми в Ñказании REFERENCING, Ñо в ниÑ
бÑдÑÑ Ð²Ð¸Ð´Ð½Ñ Ð¾Ð±ÑÐ°Ð·Ñ ÑÑÑок из вÑеÑ
заÑÑонÑÑÑÑ
ÑекÑий или доÑеÑниÑ
ÑаблиÑ. Ð ÑлÑÑае Ñ Ð¿Ð¾Ñомками в иеÑаÑÑ
ии наÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑÐ°Ð·Ñ ÑÑÑок бÑдÑÑ ÑодеÑжаÑÑ ÑолÑко ÑÑолбÑÑ, пÑиÑÑÑÑÑвÑÑÑие в ÑаблиÑе, Ñ ÐºÐ¾ÑоÑой ÑвÑзан ÑÑиггеÑ. РнаÑÑоÑÑее вÑÐµÐ¼Ñ ÑÑиггеÑÑ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑок Ñ Ð¿ÐµÑеÑ
однÑми оÑноÑениÑми нелÑÐ·Ñ Ð¾Ð¿ÑеделиÑÑ Ð´Ð»Ñ ÑекÑий или доÑеÑниÑ
ÑÐ°Ð±Ð»Ð¸Ñ Ð² иеÑаÑÑ
ии наÑледованиÑ.
Ð 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 FUNCTION check_account_update(); То же Ñамое, но ÑÑнкÑÐ¸Ñ ÑÑиггеÑа бÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ, ÑолÑко еÑли ÑÑÐ¾Ð»Ð±ÐµÑ balance пÑиÑÑÑÑÑвÑÐµÑ Ð² ÑпиÑке ÑелевÑÑ
ÑÑолбÑов ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ UPDATE:
CREATE TRIGGER check_update
BEFORE UPDATE OF balance ON accounts
FOR EACH ROW
EXECUTE FUNCTION check_account_update(); Ð ÑÑом пÑимеÑе ÑÑнкÑÐ¸Ñ Ð±ÑÐ´ÐµÑ Ð²ÑполнÑÑÑÑÑ, еÑли знаÑение ÑÑолбÑа balance в дейÑÑвиÑелÑноÑÑи изменилоÑÑ:
CREATE TRIGGER check_update
BEFORE UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.balance IS DISTINCT FROM NEW.balance)
EXECUTE FUNCTION check_account_update(); ÐÑзов ÑÑнкÑии, ведÑÑей жÑÑнал изменений в accounts, но ÑолÑко еÑли ÑÑо-Ñо изменилоÑÑ:
CREATE TRIGGER log_update
AFTER UPDATE ON accounts
FOR EACH ROW
WHEN (OLD.* IS DISTINCT FROM NEW.*)
EXECUTE FUNCTION log_account_update(); ÐÑполнение Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки ÑÑнкÑии view_insert_row, коÑоÑÐ°Ñ Ð±ÑÐ´ÐµÑ Ð²ÑÑавлÑÑÑ ÑÑÑоки в нижележаÑие ÑаблиÑÑ Ð¿ÑедÑÑавлениÑ:
CREATE TRIGGER view_insert
INSTEAD OF INSERT ON my_view
FOR EACH ROW
EXECUTE FUNCTION view_insert_row(); ÐÑполнение ÑÑнкÑии check_transfer_balances_to_zero Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ опеÑаÑоÑа, пÑовеÑÑÑÑей, ÑÑо ÑÑÑоки transfer в ÑовокÑпноÑÑи даÑÑ Ð½Ñлевой баланÑ:
CREATE TRIGGER transfer_insert
AFTER INSERT ON transfer
REFERENCING NEW TABLE AS inserted
FOR EACH STATEMENT
EXECUTE FUNCTION check_transfer_balances_to_zero(); ÐÑполнение ÑÑнкÑии check_matching_pairs Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ ÑÑÑоки, пÑовеÑÑÑÑей, ÑÑо ÑооÑвеÑÑÑвÑÑÑие паÑÑ Ð¿ÑнкÑов Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ ÑинÑ
Ñонно (одним опеÑаÑоÑом):
CREATE TRIGGER paired_items_update
AFTER UPDATE ON paired_items
REFERENCING NEW TABLE AS newtab OLD TABLE AS oldtab
FOR EACH ROW
EXECUTE FUNCTION check_matching_pairs();РРазделе 39.4 пÑиведÑн полнÑй пÑÐ¸Ð¼ÐµÑ ÑÑнкÑии ÑÑиггеÑа, напиÑанной на C.
СовмеÑÑимоÑÑÑ
ÐпеÑаÑÐ¾Ñ CREATE TRIGGER в PostgreSQL ÑеализÑÐµÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво возможноÑÑей, опиÑаннÑÑ
в ÑÑандаÑÑе SQL. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² нÑм оÑÑÑÑÑÑвÑÐµÑ ÑледÑÑÑÐ°Ñ ÑÑнкÑионалÑноÑÑÑ:
Тогда как имена пеÑÐµÑ Ð¾Ð´Ð½ÑÑ ÑÐ°Ð±Ð»Ð¸Ñ Ð´Ð»Ñ ÑÑиггеÑов
AFTERзадаÑÑÑÑ Ð¿ÑедложениемREFERENCINGÑÑандаÑÑнÑм обÑазом, пеÑеменнÑе ÑÑÑок, пÑименÑемÑе в ÑÑиггеÑаÑFOR EACH ROWнелÑÐ·Ñ Ð¾Ð±ÑÑвлÑÑÑ Ð² пÑедложенииREFERENCING. ÐоÑÑдок обÑаÑÐµÐ½Ð¸Ñ Ðº Ñаким ÑÑÑокам завиÑÐ¸Ñ Ð¾Ñ ÑзÑка, на коÑоÑом напиÑана ÑÑиггеÑÐ½Ð°Ñ ÑÑнкÑиÑ, но Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ ÑзÑка он вполне опÑеделÑннÑй. ÐекоÑоÑÑе ÑзÑки по ÑÑÑи дейÑÑвÑÑÑ Ñак, как бÑдÑо в команде пÑиÑÑÑÑÑвÑÐµÑ Ð¿ÑедложениеREFERENCINGÑ ÑказаниемOLD ROW AS OLD NEW ROW AS NEW.СÑандаÑÑ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿ÐµÑÐµÑ Ð¾Ð´Ð½Ñе ÑаблиÑÑ Ñ ÑÑиггеÑами
UPDATE, огÑаниÑиваÑÑими Ð½Ð°Ð±Ð¾Ñ Ð¾ÑÑлеживаемÑÑ ÑÑолбÑов, но Ñогда и Ð½Ð°Ð±Ð¾Ñ ÑÑÑок, видимÑÑ Ð² пеÑÐµÑ Ð¾Ð´Ð½ÑÑ ÑаблиÑÐ°Ñ , должен завиÑеÑÑ Ð¾Ñ ÑпиÑка ÑелевÑÑ ÑÑолбÑов ÑÑиггеÑа. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ñакое поведение в PostgreSQL не Ñеализовано.PostgreSQL позволÑÐµÑ Ð·Ð°Ð´Ð°ÑÑ Ð² каÑеÑÑве дейÑÑÐ²Ð¸Ñ ÑÑиггеÑа ÑолÑко ÑÑнкÑиÑ, опÑеделÑннÑÑ Ð¿Ð¾Ð»ÑзоваÑелем. СÑандаÑÑ Ð´Ð¾Ð¿ÑÑÐºÐ°ÐµÑ Ñакже вÑполнение ÑÑда дÑÑÐ³Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ SQL, напÑимеÑ,
CREATE TABLE. Ðднако ÑÑо огÑаниÑение неÑложно пÑеодолеÑÑ, Ñоздав полÑзоваÑелÑÑкÑÑ ÑÑнкÑиÑ, вÑполнÑÑÑÑÑ ÑÑебÑемÑе командÑ.
Ð ÑÑандаÑÑе SQL опÑеделено, ÑÑо неÑколÑко ÑÑиггеÑов Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑабаÑÑваÑÑ Ð¿Ð¾ поÑÑÐ´ÐºÑ ÑозданиÑ. PostgreSQL ÑпоÑÑдоÑÐ¸Ð²Ð°ÐµÑ Ð¸Ñ Ð¿Ð¾ именам, Ñак как ÑÑо бÑло пÑизнано более ÑдобнÑм.
Ð ÑÑандаÑÑе SQL опÑеделено, ÑÑо ÑÑиггеÑÑ BEFORE DELETE пÑи каÑкадном Ñдалении ÑÑабаÑÑваÑÑ Ð¿Ð¾Ñле завеÑÑÐµÐ½Ð¸Ñ ÐºÐ°Ñкадного DELETE. Ð PostgreSQL ÑÑиггеÑÑ BEFORE DELETE вÑегда ÑÑабаÑÑваÑÑ Ð¿ÐµÑед опеÑаÑией ÑдалениÑ, даже еÑли она каÑкаднаÑ. ÐÑо поведение вÑбÑано как более логиÑное. ÐÑÑ Ð¾Ð´Ð½Ð¾ оÑклонение Ð¾Ñ ÑÑандаÑÑа пÑоÑвлÑеÑÑÑ, когда ÑÑиггеÑÑ BEFORE, ÑÑабаÑÑваÑÑие в ÑезÑлÑÑаÑе ÑÑÑлоÑной опеÑаÑии, изменÑÑÑ ÑÑÑоки или не даÑÑ Ð²ÑполниÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ðµ. ÐÑо Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑивеÑÑи к наÑÑÑÐµÐ½Ð¸Ñ Ð¾Ð³ÑаниÑений или ÑоÑ
ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ
, не ÑоблÑдаÑÑиÑ
ÑÑÑлоÑнÑÑ ÑелоÑÑноÑÑÑ.
ÐозможноÑÑÑ Ð·Ð°Ð´Ð°ÑÑ Ð½ÐµÑколÑко дейÑÑвий Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÑиггеÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ»ÑÑевого Ñлова OR â Ñеализованное в PostgreSQL ÑаÑÑиÑение ÑÑандаÑÑа SQL.
ÐозможноÑÑÑ Ð²ÑзÑваÑÑ ÑÑиггеÑÑ Ð´Ð»Ñ TRUNCATE â Ñеализованное в PostgreSQL ÑаÑÑиÑение ÑÑандаÑÑа SQL, как и возможноÑÑÑ Ð¾Ð¿ÑеделÑÑÑ ÑÑиггеÑÑ Ð½Ð° ÑÑовне опеÑаÑоÑа Ð´Ð»Ñ Ð¿ÑедÑÑавлений.
CREATE CONSTRAINT TRIGGER â Ñеализованное в PostgreSQL ÑаÑÑиÑение ÑÑандаÑÑа SQL.