42.6. ТÑиггеÑÑ Ð½Ð° PL/Perl
PL/Perl можно иÑполÑзоваÑÑ Ð´Ð»Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑиггеÑнÑÑ
ÑÑнкÑий. Ð ÑÑиггеÑной ÑÑнкÑии Ñ
еÑ-маÑÑив $_TD ÑодеÑÐ¶Ð¸Ñ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¾ пÑоизоÑедÑем ÑобÑÑии ÑÑиггеÑа. $_TD â глобалÑÐ½Ð°Ñ Ð¿ÐµÑеменнаÑ, коÑоÑÐ°Ñ Ð¿Ð¾Ð»ÑÑÐ°ÐµÑ Ð½Ñжное локалÑное знаÑение пÑи каждом вÑзове ÑÑиггеÑа. ХеÑ-маÑÑив $_TD ÑодеÑÐ¶Ð¸Ñ ÑледÑÑÑие полÑ:
$_TD->{new}{foo}Ðовое знаÑение ÑÑолбÑа
foo$_TD->{old}{foo}СÑаÑое знаÑение ÑÑолбÑа
foo$_TD->{name}ÐÐ¼Ñ Ð²ÑзÑваемого ÑÑиггеÑа
$_TD->{event}СобÑÑие ÑÑиггеÑа:
INSERT,UPDATE,DELETE,TRUNCATEилиUNKNOWN$_TD->{when}Ðогда вÑзÑваеÑÑÑ ÑÑиггеÑ:
BEFORE(ÐÐ),AFTER(ÐÐСÐÐ),INSTEAD OF(ÐÐÐСТÐ) илиUNKNOWN(ÐÐÐÐÐÐСТÐÐ)$_TD->{level}УÑÐ¾Ð²ÐµÐ½Ñ ÑÑиггеÑа:
ROW(СТРÐÐÐ),STATEMENT(ÐÐÐÐ ÐТÐÐ ) илиUNKNOWN(ÐÐÐÐÐÐСТÐЫÐ)$_TD->{relid}OID ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой ÑÑабоÑал ÑÑиггеÑ
$_TD->{table_name}ÐÐ¼Ñ ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой ÑÑабоÑал ÑÑиггеÑ
$_TD->{relname}ÐÐ¼Ñ ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой ÑÑабоÑал ÑÑиггеÑ. ÐÑо обÑаÑение ÑÑÑаÑело и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð»Ð¸ÐºÐ²Ð¸Ð´Ð¸Ñовано в бÑдÑÑем вÑпÑÑке. ÐÑполÑзÑйÑе вмеÑÑо него $_TD->{table_name}.
$_TD->{table_schema}ÐÐ¼Ñ ÑÑ ÐµÐ¼Ñ, ÑодеÑжаÑей ÑаблиÑÑ, Ð´Ð»Ñ ÐºÐ¾ÑоÑой ÑÑабоÑал ÑÑиггеÑ
$_TD->{argc}ЧиÑло аÑгÑменÑов в ÑÑиггеÑной ÑÑнкÑии
@{$_TD->{args}}ÐÑгÑменÑÑ ÑÑиггеÑной ÑÑнкÑии. Ðе опÑеделено, еÑли
$_TD->{argc}Ñавно 0.
Ð ÑÑиггеÑÐ°Ñ ÑÑÐ¾Ð²Ð½Ñ ÑÑÑоки Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ ÑледÑÑÑие ваÑианÑÑ Ð²Ð¾Ð·Ð²ÑаÑа:
return;ÐÑполниÑÑ Ð¾Ð¿ÐµÑаÑиÑ
"SKIP"Ðе вÑполнÑÑÑ Ð¾Ð¿ÐµÑаÑиÑ
"MODIFY"УказÑваеÑ, ÑÑо ÑÑÑока
NEWбÑла изменена ÑÑиггеÑной ÑÑнкÑией
СледÑÑÑий пÑÐ¸Ð¼ÐµÑ ÑÑиггеÑной ÑÑнкÑии иллÑÑÑÑиÑÑÐµÑ Ð¾Ð¿Ð¸ÑаннÑе вÑÑе ваÑианÑÑ:
CREATE TABLE test (
i int,
v varchar
);
CREATE OR REPLACE FUNCTION valid_id() RETURNS trigger AS $$
if (($_TD->{new}{i} >= 100) || ($_TD->{new}{i} <= 0)) {
return "SKIP"; # пÑопÑÑÑиÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT/UPDATE
} elsif ($_TD->{new}{v} ne "immortal") {
$_TD->{new}{v} .= "(modified by trigger)";
return "MODIFY"; # измениÑÑ ÑÑÑÐ¾ÐºÑ Ð¸ вÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT/UPDATE
} else {
return; # вÑполниÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ INSERT/UPDATE
}
$$ LANGUAGE plperl;
CREATE TRIGGER test_valid_id_trig
BEFORE INSERT OR UPDATE ON test
FOR EACH ROW EXECUTE PROCEDURE valid_id();