Относительно последовательности запуска - PullRequest
3 голосов
/ 30 ноября 2011

Имейте два триггера на столе. Один триггер выполняется, когда есть вставка или обновление для каждой строки в таблице. Второй триггер выполняется, когда есть обновление для каждой строки в таблице. Какой триггер выполняется первым в ORACLE 10G, когда в строке таблицы есть оператор обновления. Есть ли порядок исполнения триггеров в Oracle? Если так, как я могу установить это?

Ответы [ 4 ]

4 голосов
/ 30 ноября 2011

Для версий до 11g, нет, заказ не указан. От 10 г Выпуск 2 документа :

Для включенных триггеров Oracle автоматически выполняет следующие действия:

  • Oracle запускает триггеры каждого типа в запланированной последовательности запуска, когда более одного триггера запускается одним оператором SQL. Сначала срабатывают триггеры уровня оператора, а затем срабатывают триггеры уровня строки.

  • Oracle выполняет проверку ограничений целостности в установленный момент времени в отношении различных типов триггеров и гарантирует, что триггеры не могут нарушить ограничения целостности.

  • Oracle предоставляет согласованные по чтению представления для запросов и ограничений.

  • Oracle управляет зависимостями между триггерами и объектами схемы, указанными в коде действия триггера

  • Oracle использует двухфазную фиксацию, если триггер обновляет удаленные таблицы в распределенной базе данных.

  • Oracle запускает несколько триггеров в неопределенном случайном порядке , если для данного оператора существует более одного триггера одного типа; то есть триггеры одного типа для одного и того же оператора не гарантированно срабатывают в каком-либо конкретном порядке.

4 голосов
/ 30 ноября 2011

Порядок, в котором сработают триггеры, является произвольным, а не тем, что вы можете контролировать в 10g.Я считаю, что технически это происходит в том порядке, в котором были созданы триггеры, но на это точно нельзя рассчитывать.

В 11g вы можете контролировать порядок срабатывания триггеров.Однако вам почти всегда лучше заменить два триггера одним триггером, который вызывает две хранимые процедуры.Таким образом, вместо

CREATE TRIGGER trg_1
  BEFORE UPDATE ON t
  FOR EACH ROW
BEGIN
  <<do thing 1>>
END;


CREATE TRIGGER trg_2
  BEFORE UPDATE ON t
  FOR EACH ROW
BEGIN
  <<do thing 2>>
END;

вам бы гораздо лучше подать что-то вроде

CREATE PROCEDURE p1( <<arguments>> )
AS
BEGIN
  <<do thing 1>>
END;

CREATE PROCEDURE p2( <<arguments>> )
AS
BEGIN
  <<do thing 2>>
END;

CREATE TRIGGER trg
  BEFORE UPDATE ON t
  FOR EACH ROW
BEGIN
  p1( <<list of arguments>> );
  p2( <<list of arguments>> );
END;
3 голосов
/ 30 ноября 2011

На 10g нельзя положиться ни на один порядок запуска стрельбы, кроме нормального оператора до, перед строкой, после строки, после заказа оператора.В 11g новое предложение FOLLOWS было добавлено в оператор CREATE TRIGGER .

0 голосов
/ 24 июля 2015

В Oracle 10g мы не контролируем триггеры, которые создаются в одно и то же время. Это выполняется случайным образом. Поэтому мы не можем сказать, какой триггер срабатывает первым. Чтобы преодолеть эту проблему, Oracle 11g представил FOLLOWS CLAUSE. Используя это, мы можем контролировать порядок выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...