|
|
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. При записи пациента на прием проводится проверка на наличие у него приемов в промежутке (+-20 мин). Если есть, то запретить вставку. При вставке проблем не возникает, но при обновлении поля выдает ошибку о мутировании таблицы. Что это за ошибка и почему она возникает, я понимаю, но вот куда мне деть SELECT? Как обойти мутирование? Или на что его заменить? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 22:39 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
оракл так и пишет - "таблица мутирована"? а номер ошибки там прилагается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 22:45 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Q.Tarantino, авторORA-04091: table name is mutating, trigger/function may not see it ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.05.2017, 22:50 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, Oracle 11R2: If you must use a trigger to update a mutating table, you can avoid the mutating-table error in either of these ways: - Use a compound DML trigger (see "Using Compound DML Triggers to Avoid Mutating-Table Error"). - Use a temporary table. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 03:01 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Vladimir Filin, Mutating-Table Restriction http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#g1699708 Using Compound DML Triggers to Avoid Mutating-Table Error http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#CHDFEBFJ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 03:08 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Vladimir Filin, Я эту теорию заранее просмотрел, у меня проблема с практикой. Я не знаю, как в моем случаем писать составной триггер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 05:09 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Vladimir Filin, мне ее обновлять даже не надо, просто посчитать количество определенных строк ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 05:17 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Vladimir Filin, если записать в before statement, то вообще триггер никак не будет реагировать на вставку, а after всегда выдает ошибку, даже если в таблице нет строк Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 05:34 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
ТОП популярных вопросов конечно уже прочитал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 09:25 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
tru55, Да, конечно, поэтому и пишу, что не получается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 09:51 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
почему мне никто не хочет помочь, может я тему неудачно назвал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 10:59 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, А с чем связана реализация на уровне триггера? Сколько сессий одновременно могут добавлять записи по одному пациенту? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 11:03 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
env, задача: если у пациента есть уже прием, то его нельзя записать на прием в интервале 20 мин до и после. Я считаю в триггере эти строки, если их количество не равно 0, но запретить вставку. Несколько сессий ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 11:09 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, Код: plsql 1. Почему сравнение с нулем? проапдейтили/вставили одну запись, запросом ее нашли,сравнили с нулем.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 11:14 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Anatoly B, я делаю то же самое. Если количество запей в интервале 20 мин не равно нулю, то запрещаю вставку. Там с логикой все хорошо, проблема в том, что оракл не дает возможность считывать данные из той же таблицы. То есть если бы я считал что-то из другой таблицы, ошибки бы не было ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 11:24 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, Выполняйте команду SELECT в триггере типа AFTER уровня statement (не for each row!). Для такого триггера уже будет согласованное состояние данных таблицы и вы сможете избежать описываемых ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 13:06 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhufЕсли количество запей в интервале 20 мин, включая только что вставленную и потому попавшую в сравнение запись, pastkhufне равно нулю Да, действительно, с чего бы тут ошибке быть... Ведь тут pastkhufс логикой все хорошо, проблема в том, что оракл не дает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 13:46 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
SQL*Plus, Ну мне же нужно предотвратить вставку, если пациент в это время на приеме! Даже если так, я ж в составном триггере выполняю SELECT в after statement? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 13:47 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
env, прошу прощения, признаю ошибку, но я имел введу в первом запросе не ошибки, когда я SELECT выполнял до вставки. Теперь все работает, спасибо всем большое! Я правильно понимаю: after statemen срабатывает после вставки, тогда, если возникает ошибка, то результат откатывается? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 14:01 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
envpastkhuf, А с чем связана реализация на уровне триггера? Сколько сессий одновременно могут добавлять записи по одному пациенту? 100500 сессий. Как это влияет на выбор уровня триггера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 14:34 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
XMLerenvpastkhuf, А с чем связана реализация на уровне триггера? Сколько сессий одновременно могут добавлять записи по одному пациенту? 100500 сессий. Как это влияет на выбор уровня триггера.это влияет на выбор уровня изоляции, блокировки таблицы или иных до/вместо триггерных действий по обеспечению целостности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 14:43 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhufналичие у него приемов в промежутке (+-20 мин)достаточно уникального индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 14:52 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf Теперь все работает, ... Вот и славно! После торжественного омывания нового триггера в достойной жидкости, есть смысл спокойно почитать пару (как минимум) тем про подобные задачки. На усмотрение pastkhuf, разумеется. dbms_photoshop.... Читай эту тему Задачка Владимир Бегун Базовая идея тут . Это не триггер, но для некоторых случаев позволяет решить задачку. Кодирование, обход мутаций и обеспечение целостности данных при конкурентном изменении данных в таблице -- это ряд вещей, над которыми приходится задумываться решая эту и подобные ей задачи используя DIY-методы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 14:58 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
непересекающиеся интервалы иных до/вместо триггерных действий по обеспечению целостности. Триггер- инструмент, обеспечение целостности- целевая функция. Инструменты могут быть разные, уникальный индекс- на мой взгляд, предпочтительнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 15:01 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
-2-, недостаточно. Если я хочу записаться на 11:30, то у меня не должно быть приемов с 11:10 по 11:50 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 15:06 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf-2-, недостаточно. Если я хочу записаться на 11:30, то у меня не должно быть приемов с 11:10 по 11:50 сделай табличку "минуты приема клиента", на неё повесь уникальный ключ. вставляй туда 40 строк из селекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 15:21 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhufнедостаточно. Если я хочу записаться на 11:30, то у меня не должно быть приемов с 11:10 по 11:50достаточно только уникального индекса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 15:32 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, на правах шутки Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 15:56 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
XMLer, зачем? у меня уже работает с составным триггером ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:10 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
-2-, объясните, пожалуйста, как? а то я не понимаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:12 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhufу меня уже работает с составным триггеромЭто тебе только кажется. Пока ты наивно думаешь, что твоя сессия - единственная во вселенной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:13 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
ElicЭто тебе только кажется. Ты не совсем прав, она и для нескольких сессий будет работать, просто не совсем так, как ожидается. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:19 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Elic, Хорошо, как мне тогда решить эту задачу, чтоб не было проблем в случае нескольких сессий? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:26 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, самое простое триггер-вспомогательная_табличка-уникальный_индекс (если вариант тупым округлением не прокатывает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:35 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhufХорошо, как мне тогда решить эту задачу, чтоб не было проблем в случае нескольких сессий? 20496827 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:35 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
простите, я начинаю не въезжать Сергей Арсеньевpastkhuf, (если вариант тупым округлением не прокатывает). что округлять? время приема? зачем? Сергей Арсеньевpastkhuf, самое простое триггер-вспомогательная_табличка-уникальный_индекс. Ну вот я стараюсь сам догадаться, но не получается. Для чего вспомогательная таблица, что там будет хранится? Что нам даст уникальный индекс? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 16:52 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf, ну самое простое же во вспомогательной табличке хранятся минуты (truncate(sysdate,'MI')+(level-21)/24/60)), которые заняты каждым вносимым талончиком и пациент. Соответственно индекс на ней. Что занята минута может быть не более одного раза. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 17:07 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
ElicpastkhufХорошо, как мне тогда решить эту задачу, чтоб не было проблем в случае нескольких сессий? 20496827 Я соврал про только . Древнее решение от orawish также ограничивает "непрерывность" интервалов, а другое решение использовать матвью. Или есть вариант? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 17:14 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Упрощенный взгляд на проблему Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 17:27 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhuf Ну вот я стараюсь сам догадаться, но не получается. Для чего вспомогательная таблица, что там будет хранится? Что нам даст уникальный индекс? Код: plsql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 17:35 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, XMLer Спасибо большое за подробный ответ! Я постараюсь все это понять, но, чувствую, мне нужно еще поучиться, иначе, если я продолжу тупить, я вас замучаю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 18:01 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
XMLer Код: plsql 1. 2. 3. У Вас будут ложноположительно перекрываться диапазоны. Например 12:10+19 и 12:48-19 это 12:29 но между 12:10 и 12:48 чуть больше 20 минут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.05.2017, 23:27 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
pastkhufSQL*Plus, Ну мне же нужно предотвратить вставку, если пациент в это время на приеме! Даже если так, я ж в составном триггере выполняю SELECT в after statement? Для предотвращения вызывайте в триггере RAISE_APPLICATION_ERROR и обрабатывайте получаемую ошибку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.05.2017, 00:49 |
|
||
|
Мутирование таблицы
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевУ Вас будут ложноположительно перекрываться диапазоны. Например 12:10+19 и 12:48-19 это 12:29 но между 12:10 и 12:48 чуть больше 20 минут Вы правы, больше 20 минут, а точнее 40 минут. ТС пишет: pastkhuf-Если я хочу записаться на 11:30, то у меня не должно быть приемов с 11:10 по 11:50 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.05.2017, 09:46 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1885903]: |
0ms |
get settings: |
7ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
159ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 453ms |

| 0 / 0 |
