Классика баз данных - статьи

       

Тело триггера, которое состоит из


Тело триггера, которое состоит из одного или более операторов SEQUEL, выполняется сразу же после выполнения указанного действия любым пользователем. Если оператор SEQUEL выполняет действие (например, модификацию) над многими кортежами, и это действие вызывает триггер, то триггер выполняется повторно, сразу после модификации каждого кортежа. Триггеры всегда выполняются немедленно и не могут быть отложены до конца транзакции. В теле триггера можно использовать слова OLD и NEW для ссылки на предыдущее и измененное значения кортежа, как показано в примере С8.

С8. (Этот триггер автоматически модифицирует соответствующие атрибуты NEMP в таблице DEPT при каждой модификации атрибута DNO служащего.)

DEFINE TRIGGER T1 ON UPDATE OF EMP(DNO): (UPDATE DEPT SET NEMPS = NEMPS + 1 WHERE DNO = NEW EMP.DNO

UPDATE DEPT SET NEMPS = NEMPS – 1 WHERE DNO = OLD EMP.DNO

К кортежу, вызывающему триггер, может быть присоединена метка, и эта метка может использоваться в теле триггера. Кроме того, оператор в теле триггера может содержать раздел IF, который делает его выполнение зависимым от некоторых условий, как показано в примере С9.

С9. При удалении служащего из EMP, если в его отделе больше не остается служащих, удалить соответствующую запись в DEPT.

DEFINE TRIGGER T2 ON DELETION OF EMP X: (IF (SELECT COUNT(*) FROM EMP WHERE DNO = X.DNO) = 0 THEN DELETE DEPT WHERE DNO = X.DNO)

Возможно, один оператор модификации будет вызывать несколько триггеров и несколько утверждений целостности. В этом случае сначала выполняются триггеры в порядке, определенном системой. Поскольку триггеры выполняются по принципу "кортеж-за-кортежем", один оператор SEQUEL может вызвать выполнение нескольких триггеров после модификации каждого кортежа. Если выполнение триггера вызывает другие триггеры, эти триггеры (второго уровня) выполняются перед продолжением выполнения начального набора триггеров. Тот, кто определяет триггер, обязан гарантировать, что триггер не выполнит некоторое действие, которое приведет к бесконечному зацикливанию вызовов этого триггера.

Содержание  Назад  Вперед