|
|
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Добрый вечер! не очень разбираюсь в Oracle, хотел узнать мнение профессионалов Имеется таблица с колонками DATE_BEGIN и DATE_END, необходимо при добавлении записей проверять, чтобы новые записи не пересекались с уже имеющимися по дате. Вот такой код вроде работает. Хотелось бы узнать 1. корректен ли он? 2. будет ли он работать, если данные будут добавлять/изменять из нескольких сессий ? 3. где лучше добавлять такого рода проверки - на уровне приложения, на уровне БД или имеются иные варианты ? Код: 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. 49. Заранее благодарен за полезную информацию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 00:53 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Забыл версию указать, если это критично Код: plsql 1. Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for Linux: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 01:05 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Baturin Alexey2. будет ли он работать, если данные будут добавлять/изменять из нескольких сессий ?Не будет. На форуме были примеры, как муторно можно реализовать такую целостность декларативно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 01:29 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Тему можно закрывать, благодарю за коммент для себя сделал вывод, чтобы грамотно реализовать такое, необходимо закрывать прямой доступ к INSERT INTO t, т.к. доступ не будет синхронизирован а для добавления/изменения данных в t использовать процедуру и в ней осуществлять синхронизацию доступа к таблице t, например через запрос select resource_name into l_resource_name from another_table where resource_name = p_resource_name FOR UPDATE; далее проверять запросом пересечение интервалов уже в таблице t, и уже вызывать исключение или commit транзакции подробнее написано по этой ссылке https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:42171194352295 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 13:47 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Baturin AlexeyТему можно закрывать, благодарю за коммент для себя сделал вывод, чтобы грамотно реализовать такое, необходимо закрывать прямой доступ к INSERT INTO t, т.к. доступ не будет синхронизирован а для добавления/изменения данных в t использовать процедуру и в ней осуществлять синхронизацию доступа к таблице t, например через запрос select resource_name into l_resource_name from another_table where resource_name = p_resource_name FOR UPDATE; далее проверять запросом пересечение интервалов уже в таблице t, и уже вызывать исключение или commit транзакции подробнее написано по этой ссылке https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:42171194352295 2787115 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 14:51 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Baturin AlexeyТему можно закрывать, благодарю за коммент для себя сделал вывод, чтобы грамотно реализовать такое, необходимо закрывать прямой доступ к INSERT INTO t, т.к. доступ не будет синхронизирован а для добавления/изменения данных в t использовать процедуру и в ней осуществлять синхронизацию доступа к таблице t, например через запрос select resource_name into l_resource_name from another_table where resource_name = p_resource_name FOR UPDATE; далее проверять запросом пересечение интервалов уже в таблице t, и уже вызывать исключение или commit транзакции подробнее написано по этой ссылке https://asktom.oracle.com/pls/asktom/f?p=100:11:::::P11_QUESTION_ID:42171194352295 Похоже ты прочитал Тома по-диагонали. Том предложил это решeние только потому что "вопрошавший" был на Oracle 9i и "отверг" materialized view решeние только потому что оно на 9i не работает. Надеюсь ты не на 9i? SY. P.S. Очень часто читая Тома люди берут предложенные им решения без учета того что этому решению 2, 3, 5 а то и 10 лет а Oracle на месте не стоит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 14:53 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Так, для побалoваться: Код: 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. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 15:23 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SYТак, для побалoваться: Код: plsql 1. Не смешно. Больше похоже на скрытую рекламу какой-нибудь экзадаты. Её, кстати, хватит для timestamp-а? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 15:42 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, в t_expanded ID не надо? .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 15:46 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
ElicНе смешно. Больше похоже на скрытую рекламу какой-нибудь экзадаты. Её, кстати, хватит для timestamp-а? А вот тут все зависит от интервала, поэтому и сказал - для баловства. Например если интервал по дням а не по секундам, то вполне рабочий вариант. Даже по часам если интервал, скажем, между 1900г и 2100г: Код: plsql 1. 2. 3. 4. 5. 6. 7. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 16:56 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, Пример и правда интересный. Но в реальности интервалы обычно привязаны к объектам, которых сто тыщ мильонов. И в такой ситуации этот способ уже не прокатит'. Вот если бы можно было чистить t_expanded по завершению транзакции, которая писала в таблицу с интервалами. Есть в оракле какой-нито "триггер" на коммит? Или что-то еще можно придумать? Мне бы пригодились. (: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 20:08 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Не согласенНо в реальности интервалы обычно привязаны к объектам, которых сто тыщ мильонов.В таком случае у тебя есть через что сериализовать проверку - блокировкой проверяемого объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 20:15 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Не согласенВот если бы можно было чистить t_expanded по завершению транзакции, которая писала в таблицу с интервалами. Не понял. Не согласенЕсть в оракле какой-нито "триггер" на коммит? Есть - через refresh on commit materialized view. А так, ждать пока Oracle добавит поддержку констрейнтов к temporal validity. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.11.2016, 21:10 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, Данные в таблице t_expanded нужны только в период внесения изменений в интервалы и только по тем объектам, в интервалы которых вносятся изменения. Как только началась запись в интервалы, даты блокируются в t_expanded. Транзакция завершилась - блокировки очищены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 10:11 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Не понял. Таблица t_expanded обязана хранить все точки всех интервалов объекта из таблицы t. Так-что в триггере придется заполнять t_expanded точками всех ужe существующих интервалов объекта что eсть мутация, не говоря уже о производительности. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 12:24 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, Производительность, несомненно, просядет, но 4К записей на объект на десятилетие терпимо. Тем более, что изменение данных на глубину больше года обычно заблокировано, то можно и четырьмя сотнями обойтись. Мутация тоже не сильно пугает. Т.к. первоначальное заполнение нужно сделать только по тем интервалам, которые были закоммичены до старта транзакции. Меня смущает другое. Возни с аккуратным заполнением t_expanded будет больше, чем с написанием скрипта, ищущим пересечение интервалов, с последующим разруливанием наложений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 17:12 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Не согласенМутация тоже не сильно пугает. Т.к. первоначальное заполнение нужно сделать только по тем интервалам, которые были закоммичены до старта транзакции. Ну и как-же ты её обойдешь? Нет, обойти конечно можно через пакет и набор триггеров но тот еще геморрой ну и производительность опять просядет. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.11.2016, 18:19 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, Я считал, что прагма автономус даёт в триггере доступ к данным закоммиченным до старта текущей транзакции, не вызывая мутацию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2016, 06:45 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Не согласенЯ считал, что прагма автономус даёт в триггере доступ к данным закоммиченным до старта текущей транзакции, не вызывая мутацию. И что тебe даст анонимная транзакция кроме потери транзакционности? SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2016, 15:52 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, Сначала под прагмой обновлю состояние в t_expanded по ранее закоммиченным интервалам. Потом без прагмы обновлю состояние t_expanded по текущему dml. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2016, 06:46 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
в любом случае, кроме матвью, будет полезно пару раз в день джоб запускать, для проверки корректности интервалов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2016, 08:57 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
Не согласенСначала под прагмой обновлю состояние в t_expanded по ранее закоммиченным интервалам. Потом без прагмы обновлю состояние t_expanded по текущему dml. Ты сам сeбя послушай: "Данные в таблице t_expanded нужны только в период внесения изменений в интервалы и только по тем объектам, в интервалы которых вносятся изменения". Вот и обьяcни как и что ты внесешь в t_expanded и главное как и когда ты удалишь из t_expanded. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2016, 16:16 |
|
||
|
Пересечение интервалов
|
|||
|---|---|---|---|
|
#18+
SY, Три ха-ха. Закольцевались.;) автор ... и главное как и когда удалить ... С этого-то я и начал. авторвот если бы можно было чистить 19857379 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2016, 06:37 |
|
||
|
|

start [/forum/topic.php?fid=52&tid=1887061]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
208ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 250ms |
| total: | 563ms |

| 0 / 0 |
