Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
24.10.2007, 08:50
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Здравствуйте! Суть проблемы: Имеется таблица, при проектировании которой не удосужились позабоится о том , чтобы отслеживалась уникальность записи по 5 ее столбцам. Написано клиентское ПО, в котором нет проверки на уникальность вставляемой(или обновляемой) записи. Переписать ПО невозсожно. Задача: Средствами СУБД обеспечить уникальность каждой записи в таблице. Что не получается: Построил уникальный индекс по 5 полям искомой таблицы. Целостность отслеживается конечно. но мне нужно подавить ошибку о дублировании. Поскольку если эта ошибка возникает - то не проходит тразакция, инициированная клиентским ПО. Создаю триггер на insert, update в котором пишу EXCEPTION WHEN unique_violation THEN NULL; Не отслеживается ошибка. Подскажите гуру, как победить проблему ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 10:13
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
а что вы хотите, что бы ошибка была или не была? ) и при ошибке какие хотите сделать действия? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 10:26
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
моя задача подавить сообщение об ошоибке о дублировании уникального ключа т.е чтобы СУБД не ругалась в данном конкретном случае. Если такая ситуация возникает - просто скромно промолчать и все. Соответсвенно ничего не делая(апдейт и инсерт в этом слуае проигнорировать) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:11
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Триггер на BEFORE INSERT OR DELETE в котором проверка, return SKIP если найден дубль. + обычный не уникальный индекс по этим полям для ускорения проверки. Можно не на все поля, а только самые селективные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:11
|
|||
|---|---|---|---|
unique_violation |
|||
|
#18+
Не уверен, что не возникнет ситуации про одновременной вставке двумя разными сессиями, когда для каждой существовать еще не будет, а при коммите получим ошибку, но вот мой вариант: Код: plaintext 1. 2. 3. 4. 5. 6. Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:19
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. вот как оно есть сейчас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:23
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Написал вариант pamir'a повторять не буду. Но то что это полумера опять же соглашусь с pamir'ом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:35
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Господа. Уникальность записи нужно определить по 5 полям. Не меньше. Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено. И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов. Спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:36
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
rodinalex Код: plaintext 1. 2. вот как оно есть сейчас. триггер до вставки... еще не может быть unique_violation ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:43
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
в том и дело. а после вставки уже не работает событие ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:49
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
rodinalexГоспода. Уникальность записи нужно определить по 5 полям. Не меньше. Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено. И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов. Спасибо про 60 млн, не в курсе. селектами проверять НЕПРАВИЛЬНО! задание уже было "удалить зуб не открывая рот" ) Я далеко не гуру в подгрес, по моему мнению, еще как вариант: Включам отложенную проверку целостности, кажись возможно. В триггере AFTER проверяем опять же селектами, в надежде, что по уникальному индексу будет приемлемый поиск, в чем очень сомневаюсь (5 полей 60 млн записей). если уникальность нарушена - удаляем. Хотелось бы услышать мнение Гуру. Вышесказанное бред? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:51
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Думается мне что проверка в триггере перед вставкой записи на уникальность довольно медленный способ.... Особенно если таблица содержит Х млн. записей.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:52
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
наверное, можно еще использовать CONSTRAINT TRIGGER но опять же с селектами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:52
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Gold_ rodinalexГоспода. Уникальность записи нужно определить по 5 полям. Не меньше. Я делал уникальный индекс что это работает быстрей чем сеелекты. Однозначно эксперементально подтверждено. И когда в таблице 60 миллионов записей это ощутимо. поэтому решение нужно найти именно без селлектов. Спасибо про 60 млн, не в курсе. селектами проверять НЕПРАВИЛЬНО! задание уже было "удалить зуб не открывая рот" ) Я далеко не гуру в подгрес, по моему мнению, еще как вариант: Включам отложенную проверку целостности, кажись возможно. В триггере AFTER проверяем опять же селектами, в надежде, что по уникальному индексу будет приемлемый поиск, в чем очень сомневаюсь (5 полей 60 млн записей). если уникальность нарушена - удаляем. Хотелось бы услышать мнение Гуру. Вышесказанное бред? ) Не подойдет. Быстрое решение нужно в том числе из-за кол-ва инсертов в еденицу времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 11:53
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
XGrayДумается мне что проверка в триггере перед вставкой записи на уникальность довольно медленный способ.... Особенно если таблица содержит Х млн. записей.... Подскажите, как в принципе можно "отменить" вставку в триггере BEFORE не вызывая исключение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 12:30
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
GoldПодскажите, как в принципе можно "отменить" вставку в триггере BEFORE не вызывая исключение? смотри выше - код уже приводили в общем случае - вернуть из триггера null... RETURN NULL; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 12:48
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
domanix.. RETURN NULL; Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 13:35
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
http://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html 37.7.5. Trapping Errors /// Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код... не понятно. но уверен что проблема как то решаема ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 13:54
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
rodinalexhttp://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html 37.7.5. Trapping Errors /// Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код... не понятно. но уверен что проблема как то решаема Стал вызывать отдельную функцию? Или похожее делаешь в триггерной функции. Покажи код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 13:58
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
rodinalexhttp://www.postgresql.org/docs/8.2/interactive/plpgsql-control-structures.html 37.7.5. Trapping Errors /// Почему у меня не работает не пойму... илэто пример выполнениятолько для одной сессии? в смсле делаю какаие то операции и в конце запроса всталвяю такой код... не понятно. но уверен что проблема как то решаема Стал вызывать отдельную функцию? Или похожее делаешь в триггерной функции. Покажи код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 14:04
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
rodinalex Код: plaintext 1. 2. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. вот как оно есть сейчас. писал уже код ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 14:11
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
rodinalex... писал уже код Так и я писал. Откуда unique_violation, если строчка еще не вставлена. Триггер то BEFORE ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
24.10.2007, 19:52
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Я сюда потому и обратился что не могу самостоятельно найти правильный ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.10.2007, 08:53
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
Обработать исключение в триггере невозможно потому как исключение возникает именно во время операции втавки а не перед/после (BEFORE INSERT/AFTER INSERT). Проверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей.... Думаю осталось только одно: уважаемому rodinalex'у поправить иходники постгресса в том месте где возникает искючение unique_violation написать что-то вроде: Код: plaintext 1. 2. 3. 4. 5. А настоящие Гуру пусть посоветуют ему где править :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
25.10.2007, 10:21
|
|||
|---|---|---|---|
|
|||
unique_violation |
|||
|
#18+
XGrayПроверка записи на уникальность перед вставкой = тормоза при большом кол-ве записей....не тормоза при наличии индекса XGrayпоправить иходники постгресса IF(TableName=='test_table')ага :) и предложить этот патч в pgsql-patches ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=2004891]: |
0ms |
get settings: |
8ms |
get forum list: |
26ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
16ms |
get forum data: |
4ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 421ms |

| 0 / 0 |
