Решение проблемы таблицы мутаций в Oracle SQL приводит к тупику - PullRequest
4 голосов
/ 27 февраля 2011

Эй, я пытаюсь создать триггер в моей базе данных Oracle, который изменяет все остальные записи, кроме только что измененной, и запускает триггер на 0. Поскольку я обновляю записи в той же таблице, что и запустил триггер я получил ошибку таблицы мутаций. Чтобы решить эту проблему, я поместил код в качестве анонимной транзакции, однако это вызывает тупик.

Триггерный код:

CREATE OR REPLACE TRIGGER check_thumbnail AFTER INSERT OR UPDATE OF thumbnail ON photograph
FOR EACH ROW
BEGIN
  IF :new.thumbnail = 1 THEN
    check_thumbnail_set_others(:new.url);
  END IF;
END;

Код процедуры:

CREATE OR REPLACE PROCEDURE check_thumbnail_set_others(p_url IN VARCHAR2)
IS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
    UPDATE photograph SET thumbnail = 0 WHERE url <> p_url;
    COMMIT;
END;

Я предполагаю, что я вызываю тупик, потому что триггер запускает себя внутри себя. Есть идеи?

1 Ответ

3 голосов
/ 28 февраля 2011

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

Если вы хотите, чтобы данные были транзакционно согласованными, вам потребуется несколько триггеров и некоторый способ хранения состояния.Самый простой вариант - создать пакет с коллекцией типа thumbnail.url%, а затем создать три триггера на таблице.Триггер оператора before очищает коллекцию.Триггер уровня строки вставит значение: new.url в коллекцию.После этого триггер оператора после считывает значения из коллекции и вызывает процедуру check_thumbnail_set_others (которая не будет автономной транзакцией).

...