Удовольствие от триггеров базы данных и рекурсии в 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.
В качестве альтернативы, если его значения конфигурации вы пытаетесь защитить, я бы сгруппировал их все в одну таблицу и применил к ней разрешения (проще, чем защита на основе строк).