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

start [/forum/topic.php?fid=53&startmsg=34889812&tid=2004891]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
46ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 213ms |
| total: | 388ms |

| 0 / 0 |
