Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

триггер не сработал

4 views
Skip to first unread message

dmitry grebeniuk

unread,
Jun 21, 2007, 4:44:26 AM6/21/07
to
Здравствуйте, All.

Есть проблема.
Выполняем 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

Alexander Pedin

unread,
Jun 21, 2007, 11:07:29 PM6/21/07
to
Hello, dmitry!

Чет Июн 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 Атланты]

dmitry grebeniuk

unread,
Jun 25, 2007, 2:04:11 AM6/25/07
to
Здравствуйте, Alexander.

Вы писали 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, не в начале и не в конце
транзакции. Насколько я понимаю, отключенный триггер не
вызвал бы такого избирательного поведения.

Andrey Maximenko

unread,
Jun 25, 2007, 3:45:25 AM6/25/07
to
Hello, dmitry!

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


Andrey Maximenko

unread,
Jun 25, 2007, 4:15:17 AM6/25/07
to
Hello, dmitry!

dg> Есть проблема.
dg> Выполняем DML-операции над таблицей A, в триггерах на
dg> которую выполняются процедуры пакетов, делающие
dg> DML-операции над таблицами B и C.
dg> По факту видим, что таблица A изменилась, а таблицы B
dg> и C остались неизменными. Такое повторяется весьма редко,
dg> пара случаев на десяток тысяч insert/update/delete.

ну и лог ведите, пока не поймаете

dmitry grebeniuk

unread,
Jun 25, 2007, 8:44:18 AM6/25/07
to
Здравствуйте, Andrey.

Вы писали 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 триггера на
некоем представлении. Но там тоже нет условных
операторов.

0 new messages