2012-04-10 2 views
2

Я нахожусь в Oracle Express 11g. Я пытаюсь создать триггер:Создание триггера UPDATE, вызывающего удаление строки запуска

CREATE TRIGGER remove_useless_surveys 
    BEFORE UPDATE OF agent_id, agency_id, province_id ON surveys 
    FOR EACH ROW WHEN (
    new.agent_id IS NULL AND 
    new.agency_id IS NULL AND 
    new.province_id IS NULL) 
DELETE FROM surveys WHERE survey_code = :new.survey_code 

agent_id, agency_id и province_id внешние ключи, с ON DELETE SET NULL пункт.

Мне нужна строка в таблице опросов, которая будет удалена, когда все три внешних ключа установлены в NULL (потому что указанные строки удалены).

Триггер компилируется без каких-либо проблем, но когда условие срабатывает, то я получаю эту ошибку:

SQL error: ORA-04091: table REALESTATE.SURVEYS is mutating,
trigger/function may not see it ORA-06512: at
"REALESTATE.REMOVE_USELESS_SURVEYS", line 1 ORA-04088: error during
execution of trigger 'REALESTATE.REMOVE_USELESS_SURVEYS'
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it"
*Cause: A trigger (or a user defined plsql function that is referenced in
this statement) attempted to look at (or modify) a table that was
in the middle of being modified by the statement which fired it.
*Action: Rewrite the trigger (or function) so it does not read that table.

На самом деле, я знаю, что я редактирую ту же таблицу, что уволил курок. Но я хочу отменить обновление или завершить его, мне все равно, а затем удалите эту строку.

Вы можете мне помочь? Как я могу достичь того, что я пытаюсь сделать?

+0

Может быть выполнено выражение триггера или PL функции/SQL. Этот триггер/функция попытался изменить или запросить таблицу, которая в настоящее время модифицируется оператором, который запускал триггер/функцию.Pls проверяет http://www.techonthenet.com/oracle/errors/ora04091.php – user1127214

+0

@ user1127214: да, это точка :) – gd1

ответ

3

Вы можете использовать триггер уровня заявление так:

CREATE TRIGGER remove_useless_surveys 
AFTER UPDATE OF agent_id, agency_id, province_id ON surveys 
BEGIN 
    DELETE FROM surveys 
    WHERE agent_id IS NULL 
    AND agency_id IS NULL 
    AND province_id IS NULL; 
END; 
+0

Спасибо ....... :) – gd1

+0

+1. Однако, если таблица большая, это может добавить значительную проблему производительности для каждого обновления в таблице ..., которое может быть смягчено с помощью подходящего функционального индекса. –

Смежные вопросы