проблема с изменяющимися таблицами - PullRequest
1 голос
/ 12 ноября 2009

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

Ответы [ 3 ]

8 голосов
/ 12 ноября 2009

Метод автономной транзакции - обходной путь для этого, но он не решает некоторые другие фундаментальные проблемы.

Основная проблема этого метода заключается в том, что, когда в таблице одновременно происходит несколько модификаций, запускаемые триггеры не видят результатов других модификаций. Поэтому результаты, которые вы получаете из кода триггера, могут быть неверными.

Например, если у вас был триггер в таблице «заказов клиентов», который предназначен для ведения столбца «общее количество заказов клиентов» в таблице клиентов, то два размещенных заказа одновременно не могут видеть друг друга. каждый из них пытается обновить «общее количество заказов клиентов», чтобы общее количество исключало другой заказ.

По этой и другим причинам часто считается плохой практикой использовать триггеры для бизнес-логики или поддерживать другие данные таблицы.

4 голосов
/ 12 ноября 2009

Перефразируя Тома Кайка:

когда я сталкиваюсь с ошибкой изменяющейся таблицы, у меня возникает серьезный фатальный недостаток в моей логике.

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

Возможное решение можно найти здесь . Есть еще несколько дискуссий на эту тему в Ask Tom, найдите их и прочитайте их. Вы получите очень ценные знания.

0 голосов
/ 12 ноября 2009

Запуск триггера в автономной транзакции (отдельная транзакция)

create or replace trigger xxx
before .... on .....

declare
.....

pragma autonomous transaction;
begin
.....your code.....
end;

Привет
K

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...