Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Gold_Многоверсионных СУБД (например IB) проверять, например на уникальность, мягко говоря, не рекомендуется. В Informix'e, видимо благодаря блокировке можно. Так ли это?В версионниках надо отдельно извращаться, т.к. две одновременных транзакции не видят данных друг друга, то проверка просто не сработает, и в бд будут неконстистентные данные (пересекающиеся периоды). В блокировочнике попроще "опоздавшая" транзакция "зависнет" и проверит уже закомиченное. Gold_Как написать в чекконстраинте, например условие: (new_date_begin between date_begin and date_end) не знаю. В документации не нашел. Видимо плохо искал (. Подскажите как?Никак. Я когда ранее писал про check думал про вариант проверки самосоединением таблицы, но этот вариант во первых медленнее, во вторых информикс не позволяет делать селект из check констрейнта (я ошибочно думал что позволяет). Триггером надо проверять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2007, 14:21 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис ..Триггером надо проверять. Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2007, 14:46 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Gold_ Журавлев Денис ..Триггером надо проверять. Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре? Если в процедуре сделать сначала insert/update, а потом проверить а не противоречат-ли другие записи, то наверно получится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2007, 16:22 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис Gold_ Журавлев Денис ..Триггером надо проверять. Еще вопросик: если записи в эту таблицу заносятся через процедуру. и я уверен, что будут заносится только с использованием этой процедуры, то корректна ли проверка будет в процедуре? Если в процедуре сделать сначала insert/update, а потом проверить а не противоречат-ли другие записи, то наверно получится. Ага... и если противоречит откатываю транзакцию. А если наоборот (как я хотел), то между проверкой и insert/update может быть другой insert/update Так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.09.2007, 18:07 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Gold_Ага... и если противоречит откатываю транзакцию.Да. Gold_А если наоборот (как я хотел), то между проверкой и insert/update может быть другой insert/update Так?Именно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 08:32 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Журавлев ДенисДа, забыл. Предлагаю так: (new_date_begin between date_begin and date_end) or (new_date_end between date_begin and date_end) or (new_date_begin < date_begin and new_date_end > date_end) все таки видимо так: ((new_date_begin >= date_begin) and (new_date_begin < date_end)) or ((new_date_end > date_begin) and (new_date_end <=date_end) or ((date_begin >= new_date_begin) and (date_begin < new_date_end)) or ((date_end > new_date_begin) and (date_end <=new_date_end) начал путаться.. поправте Перемудрили. Для условия пересечения интервалоа достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999): new_date_begin <= date_end AND new_date_end >= date_begin Условие непересечения интервалов: new_date_begin > date_end OR new_date_end < date_begin ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 18:18 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
vkubr Для условия пересечения интервалоа достаточно написать так ( учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999 ): new_date_begin <= date_end AND new_date_end >= date_begin Условие непересечения интервалов: new_date_begin > date_end OR new_date_end < date_begin тогда недостаточно ограничения на входные параметры по отсутствию NULL необходимо ЕЩЁ одно ограничение на входные параметры: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 22:42 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
АнатоЛой сорри, конечно же new_date_begin <= new_date_end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 22:47 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
сорри, конечно же new_date_begin <= new_date_end П.С.: срочно спать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.09.2007, 22:48 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
АнатоЛой тогда недостаточно ограничения на входные параметры по отсутствию NULL необходимо ЕЩЁ одно ограничение на входные параметры: Код: plaintext Разумеется, это подразумевалось. Условие (beg <= end) реализуется отдельно через check constraint. Т.о. в условие пересечения/непересечения интервалов (реализуется через триггер) его можно не включать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2007, 10:10 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
vkubr[quot ] .... Перемудрили. Для условия пересечения интервалоа достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999): new_date_begin <= date_end AND new_date_end >= date_begin Условие непересечения интервалов: new_date_begin > date_end OR new_date_end < date_begin Переупростил ) Например, "новый интервал" вписывается между "старыми".. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 12:13 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Gold_ vkubr[quot ] .... Перемудрили. Для условия пересечения интервалов достаточно написать так (учитывая, конечно, что NULL'ов нет и вместо них используются 01.01.0001 и 31.12.9999): new_date_begin <= date_end AND new_date_end >= date_begin Условие непересечения интервалов: new_date_begin > date_end OR new_date_end < date_begin Переупростил ) Например, "новый интервал" вписывается между "старыми".. Что значит "новый интервал" вписывается между "старыми" ? Причем тут попарное непересечение интервалов? Может мы о разных вещах говорим? Указанные условия пересечения (непересечения) интервалов предназначены для использования в ситуации, когда есть таблица, реализующая т.н. "интервальную" историю и требуется обеспечить попарное непересечение интервалов. Предположим, что интервал задается парой колонок date_beg и date_end: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Теперь остается обеспечить, чтобы все интервалы попарно не пересекались. Для этого создаем INSERT/UPDATE-триггеры, в которых для вставляемой/редактируемой записи проверяем, что для вновь устанавливаемых значений new.date_beg и new.date_end в таблице не существует других интервалов, пересекающихся с устанавливаемым. То есть в триггере пытаемся найти пересекающийся интервал, и если таковой обнаруживается, то делаем EXCEPTION. Например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Аналогично - для UPDATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 13:07 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
vkubrВы проверяйте что-ли то что пишете. С таким триггером вообще в таблицу ничего не вставить. Код: plaintext 1. 2. 3. 4. 5. 6. 7. И вообще Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 14:18 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
А, это я даты наоборот поставил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 14:24 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Журавлев Денис vkubrВы проверяйте что-ли то что пишете. С таким триггером вообще в таблицу ничего не вставить. А Вы попробуйте. Только с тем запросом, который в триггере, а не с тем, который в Вашем посте (у Вас совсем другое условие). Условие (SELECT COUNT(*) ... ) > 1 (а не " > 0 ", как можно было бы подумать) учитывает, что в выборку попадет и сам вставляемый интервал, т.к. интервал всегда пересекается с самим собой. Конечно, если делать реализацию не через триггер, а через процедуру, используемую вместо INSERT/UPDATE и выполняющую проверку до вставки/редактирования, то условие должно быть " > 0 "). Но делать через триггер -- надежнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 14:39 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
vkubr Вы правы. Спасибо. Я кроме прочих неточностей еще и предполагал, что например периоды 2007-10-10 12:00:00 - 2007-10-10 13:00:00 и 2007-10-10 13:00:00 - 2007-10-10 14:00:00 не пересекаются... Пользователю, так удобно видеть.. надо бы решить принципиально что у меня включено в период, а что исключено ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 15:07 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
Gold_ Я кроме прочих неточностей еще и предполагал, что например периоды 2007-10-10 12:00:00 - 2007-10-10 13:00:00 и 2007-10-10 13:00:00 - 2007-10-10 14:00:00 не пересекаются... Пользователю, так удобно видеть.. надо бы решить принципиально что у меня включено в период, а что исключено В этом случае нужно просто договориться, что правая граница интервала в него не входит и соответствующим образом скорректировать условия: в условии пересечения интервалов поменять нестрогие сравнения ( >= и <= ) на строгие ( > и < ), а в условии непересечения -- наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 15:27 |
|
||
|
Да же не знаю как к єтому подойти)))
|
|||
|---|---|---|---|
|
#18+
vkubr Условие (SELECT COUNT(*) ... ) > 1 (а не " > 0 ", как можно было бы подумать) учитывает, что в выборку попадет и сам вставляемый интервал, т.к. интервал всегда пересекается с самим собой.Да, уже сообразил. vkubrКонечно, если делать реализацию не через триггер, а через процедуру, используемую вместо INSERT/UPDATE и выполняющую проверку до вставки/редактирования, то условие должно быть " > 0 ").До вставки/редактирования как раз проверять нельзя, одновременно навставляют из разных транзакций. vkubrНо делать через триггер -- надежнее.Без разницы, если правильно все сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.10.2007, 15:38 |
|
||
|
|

start [/forum/topic.php?fid=44&msg=34838706&tid=1608287]: |
0ms |
get settings: |
9ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
71ms |
get tp. blocked users: |
1ms |
| others: | 239ms |
| total: | 411ms |

| 0 / 0 |
