Удовольствие от триггеров базы данных и рекурсии в RDB

У меня была проблема на этой неделе (которую, к счастью, я решил гораздо лучше);

  • Мне нужно было сохранить пару полей в базе данных постоянной.

Итак, я выбрал сценарий для размещения на столе триггера, который бы возвращал значение к предустановленному номеру при вставке или обновлении.

База данных - это RDB, работающая на VMS (но мне было бы интересно узнать сходства для SQLServer).

Вот триггеры:

drop trigger my_ins_trig;
drop trigger my_upd_trig;

  !
  !++ Create triggers on MY_TABLE
  CREATE TRIGGER my_ins_trig AFTER INSERT ON my_table
         WHEN somefield = 2
  (UPDATE my_table table1
   SET table1.field1 = 0.1,
       table1.field2 = 1.2
   WHERE  my_table.dbkey = table1.dbkey)
  FOR EACH ROW;

  CREATE TRIGGER my_upd_trig AFTER UPDATE ON my_table
         WHEN somefield = 2
  (UPDATE my_table table1
   SET table1.field1  = 0.1,
       table1.field2  = 1.2
   WHERE  my_table.dbkey = table1.dbkey)
  FOR EACH ROW;

Время вопросов

Я ожидал бы, что это сформирует бесконечную рекурсию - но, похоже, нет? Может кто-нибудь объяснить мне, как RDB так или иначе справляется с этим... или как другие базы данных справляются с этим.

[ПРИМЕЧАНИЕ: я знаю, что это ужасный подход, но различные проблемы и сложности означали, что, хотя это просто в коде - это не может быть сделано лучшим / самым простым способом. К счастью, я не реализовал это таким образом, но я хотел бы спросить SO-сообщество о своих мыслях по этому поводу. ]

заранее спасибо

1 ответ

Решение

редактирование: кажется, что Oracle RDB просто не выполняет вложенные триггеры, которые приводят к рекурсии. Из статьи: " Триггер может вкладывать другие триггеры, если рекурсия не происходит. Оставшуюся часть ответа я оставлю здесь для всех, кто интересуется рекурсивными триггерами в других БД.

Ну, во-первых, чтобы ответить на ваш вопрос - это зависит от базы данных. Вполне возможно, что рекурсия триггера отключена на экземпляре, с которым вы работаете. Как вы можете себе представить, рекурсия триггера может привести к всевозможному хаосу, если обрабатывается неправильно, поэтому SQL Server позволяет полностью его отключить.

Во-вторых, я бы предположил, что, возможно, есть лучший способ получить эту функциональность без триггеров. Вы можете получить основанную на представлении безопасность на уровне строк с SQL Server. Тот же результат может быть достигнут с помощью Oracle VPD.

В качестве альтернативы, если его значения конфигурации вы пытаетесь защитить, я бы сгруппировал их все в одну таблицу и применил к ней разрешения (проще, чем защита на основе строк).

Другие вопросы по тегам