Триггеры БД очередность выполнения

_eldar_
Дата: 25.11.2009 07:54:44
Привет всем, у меня есть 2 триггера на одной таблице. Оба after update, но один из них на уровне строки, а другой на уровне оператора. Какой из них будет выполняться первым?
Вячеслав Любомудров
Дата: 25.11.2009 07:56:07
А голову включить?
Подумай, что происходит когда изменяется более одной строки в операторе...

PS. Можно еще в доку заглянуть
_eldar_
Дата: 25.11.2009 08:02:35
Значит триггер на уровне оперетора будет выполняться всегда позже, да?
orawish
Дата: 25.11.2009 11:22:40
_eldar_
Значит триггер на уровне оперетора будет выполняться всегда позже, да?

не всегда, а всегда в этом, вашем (афтер стейтмент) случае.. :)
Lecter
Дата: 25.11.2009 11:56:00
_eldar_,

Неужели так сложно проверит то :)

drop table t;

create table t( i int );

create or replace trigger t_before before insert on t
declare
i int; 
begin
    dbms_output.put_line('on t before insert');
end t_before;

create or replace trigger t_before_e before insert on t for each row
declare
i int; 
begin
    dbms_output.put_line('before insert on t for each row');
end t_before_;

create or replace trigger t_after after insert on t
declare
i int; 
begin
    dbms_output.put_line('on t after insert');
end t_after;

create or replace trigger t_after_e after insert on t for each row
declare
i int; 
begin
    dbms_output.put_line('after insert on t for each row');
end t_after_e;

Table dropped.
Table created.
Trigger created.
Trigger created.
Trigger created.
Trigger created.

insert into t values(1);

on t before insert
before insert on t for each row
after insert on t for each row
on t after insert

Ну еще надо добавить что сама опереция по серединке :)
_eldar_
Дата: 26.11.2009 00:48:20
Lecter,
Спасибо, так я сразу проверил :) но я ведь не знаю может мне просто везет, может они срабатывают как получиться, вот и хотелось уточнить.

Всем спасибо за помощь :)
andrey_anonymous
Дата: 26.11.2009 00:59:08
_eldar_
может мне просто везет, может они срабатывают как получиться, вот и хотелось уточнить.

АВыоопытный... :)
Если соберетесь с духом заглянуть в доку, то узнаете даже в каком порядке срабатывают триггера одного уровня (например, два строчных after-триггера).
А еще триггера могут провоцировать срабатывание триггеров на соседних табличках, вот!
_eldar_
Дата: 26.11.2009 02:30:43
Нашел :)

Порядок срабатывания триггеров:
1) срабатывают все триггеры BEFORE в каком-то порядке;
2) срабатывают все триггеры BEFORE FOR EACH ROW в каком-то порядке;
3) срабатывают все триггеры AFTER FOR EACH ROW в каком-то порядке;
4) срабатывают все триггеры AFTER в каком-то порядке.
suPPLer
Дата: 26.11.2009 10:53:46
_eldar_
Нашел :)

Порядок срабатывания триггеров:
1) срабатывают все триггеры BEFORE в каком-то порядке;
2) срабатывают все триггеры BEFORE FOR EACH ROW в каком-то порядке;
3) срабатывают все триггеры AFTER FOR EACH ROW в каком-то порядке;
4) срабатывают все триггеры AFTER в каком-то порядке.

С небольшими уточнениями для >=11g:
- порядок выполнения триггеров можно указать, используя инструкцию FOLLOWS;
- составные триггеры участвуют в каждом этапе, выполняя соответствующую этапу часть (BEFORE STATEMENT, BEFORE EACH ROW, AFTER EACH ROW, AFTER STATEMENT).