Объем транзакций Oracle при использовании из ADO.NET и с участием триггеров? - PullRequest
2 голосов
/ 06 ноября 2008

Кто-то сказал мне, что при вызове Oracle из ADO.net, при вызове нескольких вставок в цикле, когда каждая вставка вызывает срабатывание триггера, включающего в свой PL-Sql оператор Commit, что остановить невозможно который фиксирует фактическое совершение транзакции.

Т.е. я хочу, чтобы мой код ADO.Net начинал транзакцию до начала цикла, а когда цикл завершается, фиксирует все вставки только тогда и только тогда, когда каждая вставка в цикле прошла успешно. Мой источник сообщает мне, что, как работает Oracle, если эти триггеры включают операторы COmmit, то это невозможно ..

Поскольку это, кажется, очень распространенное требование, и я знаю, что это возможно в SQL Server, мне это не кажется правильным.

Это правильно?

1 Ответ

6 голосов
/ 06 ноября 2008

Ваш информатор не прав, если он говорит о триггерах базы данных Oracle:

1) Вы не можете поместить COMMIT в триггер Oracle, который не является автономным:

SQL> create trigger this_wont_work
  2  after insert on emp
  3  begin
  4    commit;
  5  end;
  6  /

Trigger created.

SQL> insert into emp (empno) values (123)
  2  /
insert into emp (empno) values (123)
            *
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "TONY.THIS_WONT_WORK", line 2
ORA-04088: error during execution of trigger 'TONY.THIS_WONT_WORK'

2) Если триггер автономен (т. Е. Имеет PRAGMA AUTONOMOUS_TRANSACTION в своем разделе объявления), тогда он может только зафиксировать любые изменения, которые он (триггер) делает.

Нет никакой опасности того, что триггер совершает работу, которую вы выполняли вне этого триггера.

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

...