CREATE TRIGGER
СинÑакÑиÑ
CREATE [ CONSTRAINT ] TRIGGER Ð¸Ð¼Ñ { BEFORE | AFTER | INSTEAD OF } { ÑобÑÑие [ OR ... ] }
ON table_name
[ 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).
ТÑиггеÑÑ, ÑÑабаÑÑваÑÑие в Ñежиме 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 нелÑзÑ. Ð ÑлÑÑае подобной поÑÑебноÑÑи бÑдÑÑ Ð±Ð¾Ð»ÐµÐµ ÑмеÑÑÐ½Ñ Ð¿Ñавила и пÑедÑÑавлениÑ.
Ðа дополниÑелÑнÑми ÑведениÑми о ÑÑиггеÑÐ°Ñ Ð¾Ð±ÑаÑиÑеÑÑ Ðº Ðлаве 36.
ÐаÑамеÑÑÑ
- имÑ
ÐмÑ, назнаÑаемое Ð½Ð¾Ð²Ð¾Ð¼Ñ ÑÑиггеÑÑ. ÐÑо Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ оÑлиÑаÑÑÑÑ Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð¸ лÑбого дÑÑгого ÑÑиггеÑа в ÑÑой же ÑаблиÑе. ÐÐ¼Ñ Ð½Ðµ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¾ ÑÑ ÐµÐ¼Ð¾Ð¹ — ÑÑÐ¸Ð³Ð³ÐµÑ Ð½Ð°ÑледÑÐµÑ ÑÑ ÐµÐ¼Ñ Ð¾Ñ Ñвоей ÑаблиÑÑ. ÐÐ»Ñ ÑÑиггеÑов огÑаниÑений ÑÑо Ð¸Ð¼Ñ Ñакже иÑполÑзÑеÑÑÑ, когда ÑÑебÑеÑÑÑ ÑкоÑÑекÑиÑоваÑÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ ÑÑиггеÑа Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ SET CONSTRAINTS.
- BEFORE
AFTER
INSTEAD OF ÐпÑеделÑеÑ, бÑÐ´ÐµÑ Ð»Ð¸ Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð²ÑзÑваÑÑÑÑ Ð´Ð¾, поÑле или вмеÑÑо ÑобÑÑиÑ. ÐÐ»Ñ ÑÑиггеÑа огÑаниÑÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ ÑказаÑÑ ÑолÑко AFTER.
- ÑобÑÑие
ÐÑÐ¸Ð½Ð¸Ð¼Ð°ÐµÑ Ð¾Ð´Ð½Ð¾ из знаÑений: INSERT, UPDATE, DELETE или TRUNCATE; ÑÑÐ¾Ñ Ð¿Ð°ÑамеÑÑ Ð¾Ð¿ÑеделÑÐµÑ ÑобÑÑие, пÑи коÑоÑом бÑÐ´ÐµÑ ÑÑабаÑÑваÑÑ ÑÑиггеÑ. ÐеÑколÑко ÑобÑÑий можно ÑказаÑÑ, добавив Ð¼ÐµÐ¶Ð´Ñ Ð½Ð¸Ð¼Ð¸ Ñлово OR.
ÐÐ»Ñ ÑобÑÑий UPDATE можно ÑказаÑÑ ÑпиÑок колонок, иÑполÑзÑÑ ÑакÑÑ Ð·Ð°Ð¿Ð¸ÑÑ:
UPDATE OF имÑ_колонки1 [, имÑ_колонки2 ... ]
Такой ÑÑÐ¸Ð³Ð³ÐµÑ ÑÑабоÑаеÑ, ÑолÑко еÑли в Ñказанном в Ñелевой команде UPDATE ÑпиÑке колонок найдÑÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм одна из пеÑеÑиÑленнÑÑ .
ÐÐ»Ñ ÑобÑÑий INSTEAD OF UPDATE ÑпиÑок колонок задаÑÑ Ð½ÐµÐ»ÑзÑ.
- table_name
ÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) ÑаблиÑÑ, пÑедÑÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð»Ð¸ ÑÑоÑонней ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑÑÑ Ð¿ÑедназнаÑен ÑÑиггеÑ.
- ÑÑÑлаÑÑаÑÑÑ_ÑаблиÑа
ÐÐ¼Ñ (возможно, дополненное ÑÑ ÐµÐ¼Ð¾Ð¹) дÑÑгой ÑаблиÑÑ, на коÑоÑÑÑ ÑÑÑлаеÑÑÑ Ð¾Ð³ÑаниÑение. Ðно иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð³ÑаниÑений внеÑнего клÑÑа и не ÑекомендÑеÑÑÑ Ð´Ð»Ñ Ð¾Ð±ÑÑного пÑименениÑ. ÐÑо Ñказание допÑÑкаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑов огÑаниÑений.
- DEFERRABLE
NOT DEFERRABLE
INITIALLY IMMEDIATE
INITIALLY DEFERRED ÐÑÐµÐ¼Ñ ÑÑабаÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑиггеÑа по ÑмолÑаниÑ. ÐодÑобнее возможнÑе ваÑианÑÑ Ð¾Ð¿Ð¸ÑÐ°Ð½Ñ Ð² докÑменÑаÑии CREATE TABLE. ÐÑо Ñказание допÑÑкаеÑÑÑ ÑолÑко Ð´Ð»Ñ ÑÑиггеÑов огÑаниÑений.
- FOR EACH ROW
FOR 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 ÑÑабоÑаеÑ, Ñ Ð¾ÑÑ Ð·Ð½Ð°Ñение колонки не менÑеÑÑÑ.
Ð ÑÑиггеÑе BEFORE ÑÑловие WHEN вÑÑиÑлÑеÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно пеÑед возможнÑм вÑзовом ÑÑнкÑии, поÑÑÐ¾Ð¼Ñ Ð¿ÑовеÑка WHEN ÑÑÑеÑÑвенно не оÑлиÑаеÑÑÑ Ð¾Ñ Ð¿ÑовеÑки Ñого же ÑÑÐ»Ð¾Ð²Ð¸Ñ Ð² наÑале ÑÑнкÑии ÑÑиггеÑа. Ð ÑаÑÑноÑÑи, ÑÑÑиÑе, ÑÑо ÑÑÑока NEW, коÑоÑÑÑ Ð²Ð¸Ð´Ð¸Ñ Ð¾Ð³ÑаниÑение, ÑодеÑÐ¶Ð¸Ñ ÑекÑÑие знаÑениÑ, возможно, изменÑннÑе пÑедÑдÑÑими ÑÑиггеÑами. ÐÑоме Ñого, в ÑÑиггеÑе BEFORE ÑÑловие WHEN не Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑÑÑÑ ÑиÑÑемнÑе колонки в ÑÑÑоке NEW (напÑимеÑ, oid), Ñак как они еÑÑ Ð½Ðµ ÑÑÑановленÑ.
Ð ÑÑиггеÑе AFTER ÑÑловие WHEN пÑовеÑÑеÑÑÑ ÑÑÐ°Ð·Ñ Ð¿Ð¾Ñле Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑÑÑоки, и еÑли оно вÑполнÑеÑÑÑ, ÑобÑÑие запоминаеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð²ÑзваÑÑ ÑÑÐ¸Ð³Ð³ÐµÑ Ð² конÑе опеÑаÑоÑа. ÐÑли же Ð´Ð»Ñ ÑÑиггеÑа AFTER ÑÑловие WHEN не вÑполнÑеÑÑÑ, Ð½ÐµÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи запоминаÑÑ ÑобÑÑие Ð´Ð»Ñ Ð¿Ð¾ÑледÑÑÑей обÑабоÑки или заново пеÑеÑиÑÑваÑÑ ÑÑÑÐ¾ÐºÑ Ð² конÑе опеÑаÑоÑа. ÐÑо пÑÐ¸Ð²Ð¾Ð´Ð¸Ñ Ðº знаÑиÑелÑÐ½Ð¾Ð¼Ñ ÑÑкоÑÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑов, изменÑÑÑÐ¸Ñ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑÑÑок, когда ÑÑÐ¸Ð³Ð³ÐµÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ ÑÑабаÑÑваÑÑ ÑолÑко Ð´Ð»Ñ Ð½ÐµÐºÐ¾ÑоÑÑÑ Ð¸Ð· Ð½Ð¸Ñ .
Ð 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();РРазделе 36.4 пÑиведÑн полнÑй пÑÐ¸Ð¼ÐµÑ ÑÑнкÑии ÑÑиггеÑа, напиÑанной на C.
СовмеÑÑимоÑÑÑ
ÐпеÑаÑÐ¾Ñ CREATE TRIGGER в PostgreSQL ÑеализÑÐµÑ Ð¿Ð¾Ð´Ð¼Ð½Ð¾Ð¶ÐµÑÑво возможноÑÑей, опиÑаннÑÑ Ð² ÑÑандаÑÑе SQL. РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð² нÑм оÑÑÑÑÑÑвÑÐµÑ ÑледÑÑÑÐ°Ñ ÑÑнкÑионалÑноÑÑÑ:
SQL позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ ÑÐ¸Ð½Ð¾Ð½Ð¸Ð¼Ñ Ð´Ð»Ñ ÑÑÑок "old" и "new" или ÑаблиÑ, коÑоÑÑе заÑем можно бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð² опÑеделении дейÑÑÐ²Ð¸Ñ ÑÑиггеÑа (напÑимеÑ, CREATE TRIGGER ... ON имÑ_ÑаблиÑÑ REFERENCING OLD ROW AS некоÑоÑое_Ð¸Ð¼Ñ NEW ROW AS дÑÑгое_имÑ...). PostgreSQL позволÑÐµÑ Ð¿Ð¸ÑаÑÑ Ð¿ÑоÑедÑÑÑ ÑÑиггеÑов на ÑазлиÑнÑÑ ÑзÑÐºÐ°Ñ , Ñак ÑÑо Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ð¼ доÑÑÑпа к даннÑм завиÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð½ÐºÑеÑного ÑзÑка.
PostgreSQL не позволÑÐµÑ Ð¾Ð±ÑаÑаÑÑÑÑ Ðº ÑÑаÑой и новой ÑаблиÑе в ÑÑиггеÑÐ°Ñ Ð½Ð° ÑÑовне опеÑаÑоÑа, Ñ. е. к ÑаблиÑам, ÑодеÑжаÑим вÑе ÑÑаÑÑе и/или новÑе ÑÑÑоки, обознаÑаемÑе как OLD TABLE и NEW TABLE в ÑÑандаÑÑе SQL.
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.
| ÐÑед. | ÐаÑало | След. |
| CREATE TEXT SEARCH TEMPLATE | УÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑе | CREATE TYPE |