Есть проблема.
Выполняем DML-операции над таблицей A, в триггерах на
которую выполняются процедуры пакетов, делающие
DML-операции над таблицами B и C.
По факту видим, что таблица A изменилась, а таблицы B
и C остались неизменными. Такое повторяется весьма редко,
пара случаев на десяток тысяч insert/update/delete.
Сказать, что я удивился -- значит ничего не сказать.
Триггер на after insert or update or delete for each
row (и update на все столбцы), единственный conditional
statement там это
if updating or inserting
then
...делаем дело...;
end if;
Никаких автономных транзакций, никаких no logging и
прочего -- всё по-честному. Триггеры разумеется были
включены, на базе не было инвалидов.
Сейчас поставил проверку изменения подчиненных таблиц,
однако в случае, когда не выполняется весь триггер, это
не поможет.
Подскажите, в чём хотя бы примерно может быть дело,
или хотя бы куда мне обратиться с этим вопросом?
--
С уважением,
dmitry mailto:gds-...@moldavcable.com
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
Чет Июн 21 2007 12:44, dmitry grebeniuk wrote to All:
dg> Есть проблема.
dg> Выполняем DML-операции над таблицей A, в триггерах на
dg> которую выполняются процедуры пакетов, делающие
dg> DML-операции над таблицами B и C.
dg> По факту видим, что таблица A изменилась, а таблицы B
dg> и C остались неизменными. Такое повторяется весьма редко,
dg> пара случаев на десяток тысяч insert/update/delete.
Может быть тpиггеp выключили пеpед DML опеpацией? А после опеpации включили...
I wish you joy! [Team Атланты]
Вы писали 22 июня 2007 г., 6:07:29:
dg>> Есть проблема.
dg>> Выполняем DML-операции над таблицей A, в триггерах на
dg>> которую выполняются процедуры пакетов, делающие
dg>> DML-операции над таблицами B и C.
dg>> По факту видим, что таблица A изменилась, а таблицы B
dg>> и C остались неизменными. Такое повторяется весьма редко,
dg>> пара случаев на десяток тысяч insert/update/delete.
AP> Может быть тpиггеp выключили пеpед DML опеpацией? А
AP> после опеpации включили...
Тоже думал про это (ведь это самое логичное), однако была
одна транзакция, где из 10000 операций, выполненных за пару
минут, не прошли только 2, не в начале и не в конце
транзакции. Насколько я понимаю, отключенный триггер не
вызвал бы такого избирательного поведения.
dg> Выполняем DML-операции над таблицей A, в триггерах на
dg> которую выполняются процедуры пакетов, делающие
dg> DML-операции над таблицами B и C.
dg> По факту видим, что таблица A изменилась, а таблицы B
dg> и C остались неизменными. Такое повторяется весьма редко,
dg> пара случаев на десяток тысяч insert/update/delete.
dg> Сказать, что я удивился -- значит ничего не сказать.
dg> Триггер на after insert or update or delete for each
dg> row (и update на все столбцы), единственный conditional
dg> statement там это
dg> if updating or inserting
dg> then
dg> ...делаем дело...;
dg> end if;
1. Может, ошибка в "...делаем дело..."?
2. Есть ли однозначная связка для А и ВиС ?
With best regards, Andrey Maximenko
dg> Есть проблема.
dg> Выполняем DML-операции над таблицей A, в триггерах на
dg> которую выполняются процедуры пакетов, делающие
dg> DML-операции над таблицами B и C.
dg> По факту видим, что таблица A изменилась, а таблицы B
dg> и C остались неизменными. Такое повторяется весьма редко,
dg> пара случаев на десяток тысяч insert/update/delete.
ну и лог ведите, пока не поймаете
Вы писали 25 июня 2007 г., 10:45:25:
dg>> единственный conditional statement там это
dg>> if updating or inserting
dg>> then
dg>> ...делаем дело...;
dg>> end if;
AM> 1. Может, ошибка в "...делаем дело..."?
В первую очередь проверил именно это. Но там
единственный условный оператор это таки этот if.
Больше условных операторов нет. Только вызовы
процедур, DML-операторы, активное использование
pl/sql-таблиц, лёгкое использование pl/sql-исключений,
и всё.
Единственная возможность -- если оракл "прощёлкал"
exception, не выполнив при этом rollback. Однако это
так же маловероятно, как и невыполнение триггера.
AM> 2. Есть ли однозначная связка для А и ВиС ?
Что Вы имеете ввиду под однозначной связкой?
Может быть я неправильно понимаю, но опишу подробнее:
на первичный ключ таблицы A ссылается внешний ключ
таблицы B. Таблица C имеет связь только с таблицей B,
однако эта связь рождается не в момент изменения таблицы
A. Фактически выполняется только update таблицы C,
тогда как для таблицы B выполняются insert/update/delete.
Однако ошибка в том, что не проходит изменение ни
таблицы B, ни таблицы C при изменении таблицы A.
Может быть что-то прояснится, если я скажу, что
таблица A изменяется из instead-of триггера на
некоем представлении. Но там тоже нет условных
операторов.