2013-06-16 5 views
0

У меня проблема с триггером на оракуле.oracle sql trigger loop update и delete

У меня есть что-то вроде этого:

Project 
------- 
currentProgress 
plannedLoads 
currentLoads 


Step 
---- 
currentProgress 
plannedLoads 
currentLoads 


Task 
---- 
currentProgress 
plannedLoads 
currentLoads 

Проект состоит за шагом и шаг состоит Task.

currentProgress всегда = currentLoads/expectedLoads.

У меня есть триггер перед вставкой в ​​Task, чтобы улучшить Step currentLoads при вставке, обновлении или удалении, а также один из них на Step currentLoads для улучшения Project currentLoads.

Так вызывается два триггера, если я обновляю Task, один для обновления Step, а затем один для Project.

Когда я обновляю Шаг, например, обновляю currentLoad.

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

Я не уверен, что я прост. Спросите меня, если нет.

Благодарим за помощь.

ответ

1

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

Кроме того, я бы использовал триггеры для проверки достоверно и в качестве дополнения к ограничениям и проверке приложений.

Я бы настоятельно рекомендовал переместить функциональность для ведения этих записей в процедуру PL/SQL и вызвать это, вместо того, чтобы напрямую обращаться к операторам DML с таблицами. Таким образом, вы остаетесь под контролем.

+0

Почему триггеры лучше использовать для проверки? Вот для чего нужны ограничения. Триггер лучше всего использовать для изменения данных при выполнении DML в таблице или для сохранения других таблиц, обновленных после первого. – Ben

+0

Триггеры с логикой приложения в основном скрыты. Вы должны приложить дополнительные усилия, чтобы обеспечить их огонь в желательном порядке, и вы несете дополнительную стоимость переключения контекста для триггеров каждой строки. Ограничения - это гарантия обеспечения целостности данных, триггеры могут дать вам дополнительную мощность. Если все, что вы хотите сделать, это удалить строки из одной таблицы, когда обновления сделаны в другую, безусловно, процедура является самым чистым и наиболее удобным для этого способом. – Ben

+1

Я не оспариваю ваше предложение о процедуре! Просто ваша формулировка первого предложения. Триггеры замаскируют, что вы не делаете DML правильно, они не проверяют данные, для чего используются ограничения. Если вы подтвердите правильность в триггере, в какой-то момент что-то обязательно будет ошибочным. – Ben