Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Есть 3 таблицы каждая для типа пользователей :Т1 для админов, Т2 для заказчиков, Т3 для владельцев В каждой таблице есть unique поле login не Primary key login varchar(32) not null unique Как написать функцию которая бы проверяла логин на уникальность? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2008, 15:45 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
я написал примено так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ERROR: syntax error at or near "exception" LINE 10: exception ^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2008, 16:09 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
извините чуть ошибся Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. ERROR: syntax error at or near "where" LINE 12: where unique_violation then ^ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2008, 16:27 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Вы не сможете проверить уникальность не блокируя конкурентный INSERT и UPDATE ps: Вы имели ввиду в этой строке: Код: plaintext это делается не так. нужно писать обычный запрос и проверять его результат. почитайте про язык plpgsql в документации. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2008, 17:24 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
valuez Есть 3 таблицы каждая для типа пользователей :Т1 для админов, Т2 для заказчиков, Т3 для владельцев В каждой таблице есть unique поле login не Primary key login varchar(32) not null unique Как написать функцию которая бы проверяла логин на уникальность? Сделать одну таблицу и повесить на неё уникальный индекс. Чтобы не переписывать приложение, можно сделать T1, T2 и T3 представлениями по этой таблице. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.10.2008, 18:09 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Сделать одну таблицу и повесить на неё уникальный индекс. Чтобы не переписывать приложение.. для таблиц T1, T2 и T3 написать триггеры, заполняющие новую таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 10:53 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
подсказали сделать примерно так : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. всё вроде в порядке функция компилируется, но какогда вставляю существующего пользователя Код: plaintext мне просто выкидывается пустая таблица, а мне надо чтобы была проверка именно этого поля (login) и в случае повтора логина постгрес должен матюкаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 12:09 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
кстати решилось так Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. немного с exception'ами не разобрался всем спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 12:35 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Ваше решение не верно. Во первых - оно не соответствует Вашему условию авторЕсть 3 таблицывы же проверяете только в одной таблице. Во вторых - авторВы не сможете проверить уникальность не блокируя конкурентный INSERT и UPDATEво время выполнения Вашей функции sp_create_user соседняя транзакция может вставить новый логин и sp_create_user его не увидит. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 12:58 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
как тогда правильно сделать ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 13:08 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
поможет ли в этом случае savepoint - rollback ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 13:20 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
valuez, Может задачу опишешь для чего все это тебе и нафига три таблицы? Не проще ли обьеденить все в одну таблицу и добавить поле status которое означало бы кто он такой админ или не админ... проверка на уникальность бы делалсь просто что то типа INSERT INTO table (login) SELECT 'newlogin' WHERE NOT EXISTS (SELECT NULL FROM table WHERE login='newlogin') RETURNING id возвратило ID значит добавилась запись и логин уникальный ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 15:47 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
авторМожет задачу опишешь для чего все это тебе и нафига три таблицы? ну описываю... имеются 3 таблицы Код: plaintext 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. пользователь регистрируется и надо проверить cуществует ли такой логин, при этом долджен быть захват ошибки Код: plaintext поэтому и написал функцию Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. вот после этого последовало [quot]Вы не сможете проверить уникальность не блокируя конкурентный INSERT и UPDATE во время выполнения Вашей функции sp_create_user соседняя транзакция может вставить новый логин и sp_create_user его не увидит.[/quot] вот я и спрашиваю можно (или вернее нужно ли) здесь применять SAVEPOINT - ROLLBACK ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 16:02 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
sourcerпроверка на уникальность бы делалсь просто что то типа INSERT INTO table (login) SELECT 'newlogin' WHERE NOT EXISTS (SELECT NULL FROM table WHERE login='newlogin') RETURNING id возвратило ID значит добавилась запись и логин уникальный Вы не сможете проверить уникальность не блокируя конкурентный INSERT и UPDATE :) Код: plaintext 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. постгрес версионник, а не блокировочник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 18:28 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
valuezвот я и спрашиваю можно (или вернее нужно ли) здесь применять SAVEPOINT - ROLLBACK ?Как Вы хотите здесь применить savepoint и зачем ? Вам нужно заблокировать все три таблицы от insert/update/delete и только после этого - проверять присутствие в них логина. но это ненужный изврат - из-за того что у Вас плохая схема данных. сделайте одну таблицу вместо трёх, с unique ограничением на login и не мучайтесь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 18:34 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
на , pg_sleep(10) в примере не обращайте внимание - это я чёта не то написал %) -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 18:35 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Ёш, Вы воще поняли что написали то? )))))) Транзакции нахрен ненужны с 8.2 версии начная для этих целей, используйте RETURNING и радуйтесь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 18:47 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Ёшvaluezвот я и спрашиваю можно (или вернее нужно ли) здесь применять SAVEPOINT - ROLLBACK ?Как Вы хотите здесь применить savepoint и зачем ? Вам нужно заблокировать все три таблицы от insert/update/delete и только после этого - проверять присутствие в них логина. но это ненужный изврат - из-за того что у Вас плохая схема данных. сделайте одну таблицу вместо трёх, с unique ограничением на login и не мучайтесь :) тут полностью согласен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 18:53 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
sourcerЁш, Вы воще поняли что написали то? )))))) Транзакции нахрен ненужны с 8.2 версии начная для этих целей, используйте RETURNING и радуйтесь.взаимное непонимание :) для каких целей ? пока первая транзакция не завершиться с commit - вторая НЕ увидит того что первая вставила в таблицу. даже если Вы принудительно не начинаете транзакцию - она начнётся автоматически - для запроса. пока Ваш первый insert проверяет и вставляет - в соседнем подключении второй инсерт может успеть вставить тот же логин. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. так понятней ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 19:26 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Уважаемый, прислушайтесь что Вам говорят. Предложили три варианта: 1) Ёш: блокировать - проверять 2) Sad Spirit: Создать таблицу с уникальным ключем и сделать вьишки и соотвествующими правила (чтобы приложению было прозрачно) 3) Я (Gold_) :) [естественно самая правильная в Вашем случае ;)]. Создать таблицу с уникальным ключем и заполнять, редактировать и удалать записи в ней соотвествующими триггерами повешанными на Ваши три таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 23:10 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Gold_Создать таблицу с уникальным ключем и заполнять, редактировать и удалать записи в ней соотвествующими триггерами повешанными на Ваши три таблицыну тоже имхо не идеальный вариант...%) unique блокируется не всегда, а только когда есть реальный конфликт уникальности, и если вставлять значения в разном порядке - нужно быть готовым к deadlock, например: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.10.2008, 23:59 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
угу, забыл дописать в пример создание собственно тригера %) Код: plaintext 1. 2. -- „Истина — это вовсе не то, что можно убедительно доказать, это то, что делает всё проще и понятнее“ — Антуан де Сент-Экзюпери ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 00:02 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Ёшну тоже имхо не идеальный вариант... Видимо из трех предложенных наихудший ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 12:57 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Gold_Ёшну тоже имхо не идеальный вариант... Видимо из трех предложенных наихудшийвторой вариант (Sad Spirit'а) имеет ту же самую "проблему" :) просто так себя unique ведёт. неважно как в него вставлять, через тригеры из трёх таблиц или напрямую - будет та же ситуация. видимо это плата за возможность неблокироваться если значения разные :) просто надо посмотреть - насколько часто параллельные транзакции одновременно вставляют несколько одинаковых значений, причём в разном порядке. в данном конкретном случае редактирования пользователей особенно если изменяется одна запись и это происходит быстро - такое имхо маловероятно и можно спокойно пользоваться unique :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 14:44 |
|
||
|
проверка на уникальность
|
|||
|---|---|---|---|
|
#18+
Ёшпросто так себя unique ведёт. неважно как в него вставлять, через тригеры из трёх таблиц или напрямую - будет та же ситуация. видимо это плата за возможность неблокироваться если значения разные :) просто надо посмотреть - насколько часто параллельные транзакции одновременно вставляют несколько одинаковых значений, причём в разном порядке.это получается задача разработчика приложения - можно например сначала отсортировать готовые для вставки записи по уникальному полю, а потом вставлять их в этом порядке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.10.2008, 15:49 |
|
||
|
|

start [/forum/topic.php?fid=53&tid=2003959]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
67ms |
get tp. blocked users: |
2ms |
| others: | 231ms |
| total: | 383ms |

| 0 / 0 |
