|
|
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
а какая разница для мутирующего триггера, вставляю ли я строку в таблицу простым insert... into... values или же через insert into ... select from..? почему так происходит, что мутирующий триггер в первом случае не срабатывает, а во втором срабатывает? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 01:23 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
The nature of mutation is such that it can occur only when a SQL statement processes more than one row. SY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 01:35 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
а вы не подскажете, где можно почитать про это подробней, чтобы понять, почему так устроено? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 02:02 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
SQL operations are SET operations. When you issue SELECT/UPDATE/INSERT/DELETE... you are not selecting/updating/inserting/deleting individual rows - you are selecting/updating/inserting/deleting SETS. If one row within a set fails - the whole operation fails. Another words SQL is not a procedural language. PL/SQL is - it allows you to work with individual rows. Trigger is written in PL/SQL and is procedural. As a result, we have a conflict. From SQL's point of view operation is done when WHOLE SET IS PROCESSED while row level trigger is trying to access table when WHOLE SET IS NOT YET PROCESSED. So from SQL's point of view table is in "in-between" state. We can not tell what is table contents at the moment. This is called mutating. In "old days" there was also a "constraining table" effect caused by mutation. Assume trigger on a parent table modifies child table. Since parent table is "mutating" Oracle can not validate foreign key. In 8i constraining issue was removed since checking of the foreign key is deferred until at least the end of the parent statement. Based on the above logic BEFORE row level trigger that fires for the first row does not cause mutation since table did not start to change yet. Same way AFTER row level trigger that fires for the last row does not cause mutation since table change is complete. That is why row level trigger never causes mutation if statement is affecting just one row. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 04:57 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
С прошедшими и наступающими праздниками! 2 SY: > That is why row level trigger never causes mutation if statement is affecting just one row. В целом хороший ответ, но концовка (процитирована) смазана. Barkovsky привел пример, который как раз и опровергает это утверждение. Oracle накладывает ограничения, связанные с возможной мутацией на все строчные триггера, независимо от количества записей, которые в результате будут обработаны. Единственное исключение делается для триггера BEFORE INSERT FOR EACH ROW. Для этого триггера, при выполнении INSERT, просто делается анализ одной из двух возможных форм этой команды. - Если это INSERT ... VALUES , то в результате будет гарантированно добавлено не более одной записи, и Oracle снимает "мутирующие" ограничения, трактуя этот триггер как триггер уровня оператора. - Если же команда INSERT ... SELECT, то возможно добавление нескольких записей (последующий анализ на SELECT ... FROM dual уже не делается) и "мутирующие" ограничения действуют. 680512 Успехов, DBGroup Consulting ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 05:33 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
стало понятней. спасибо всем за комментарии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 13:39 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
2 DBGroup Consulting: Agreed, the explanation I provided was a concept of mutating table. I had to stress the fact Oracle currently has no means of determining result set size before the processing, so it relies on VALUES clause (which guarantees a single row insert) to make such determination. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.01.2004, 17:28 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
SY, Уважаемый Соломон - не могли бы Вы ответить мне на вопрос, который имел отношение к Oracle 8? Касаемо мутирующих таблиц - не до конца понятно, что подразумевалось под понятием "ограничивающая таблица". В доках Oracle написано: https://docs.oracle.com/cd/A57673_01/DOC/server/doc/ADG73/ch9.htm @A constraining table is a table that a triggering statement might need to read either directly, for a SQL statement, or indirectly, for a declarative referential integrity constraint". "Might need to read directly" - то есть имелось в виду, что ограничивающая таблица необязательно должна была быть связана с мутирующей через foreign key? И в переводной доке по Oracle 7.0 нашел такую фразу: "Предложения в триггере строк не могут изменять столбцов первичного, внешнего или уникального ключа ограничивающей таблицы предложения триггера. Это ограничение введено с тем, чтобы успех предложения внутри триггера не зависел от порядка обработки строк или от индекса". В оригинале второго предложения - нет: "The statements of a trigger cannot change the PRIMARY, FOREIGN, or UNIQUE KEY columns of a constraining table of the triggering statement". Непонятен такой нюанс - получается, что столбцы, входящие в Primary, Foreign или Unique Key - изменять нельзя (так как успех предложения внутри триггера зависит от порядка обработки строк), но если на столбец не накладывается никаких ограничений - изменять его можно независимо от успеха предложения внутри триггера? Заранее благодарю за ответ! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2018, 18:23 |
|
||
|
мутация триггеров - вещь непостоянная?:)
|
|||
|---|---|---|---|
|
#18+
Есть понятие mutating table и constraining table. Исключение constraining table было упразднено в Oracle 8 так как проверка FK стала отложенной на конец выполнения родительcкого предложения. Так что с Oracle 8 осталась только mutating table. Так-что "The statements of a trigger cannot change the PRIMARY, FOREIGN, or UNIQUE KEY columns of a constraining table of the triggering statement" к Oracle 8 не относится что есть хорошо, но при неумелом дизайне с использованием изменяющихся natural keys может отстрелить важные органы . SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2018, 19:33 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32368507&tid=1883702]: |
0ms |
get settings: |
11ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
173ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
| others: | 242ms |
| total: | 530ms |

| 0 / 0 |
