|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
Добрый день. Есть PostgresSQL 9.6, в нем создана база данных, в базе данных есть пара таблиц (названия полей придумал не я): Код: 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.
При попытке вставить строку в таблицу housetbl таким запросом (улица с кодом 15 существует): Код: plsql 1. 2.
получаю сообщение об ошибке: Код: plsql 1. 2. 3. 4. 5. 6. 7.
Все запросы выполняются в PgAdmin3. Как я понял, возможно, возникает блокировка при вставке ( похожая тема ). Если убрать ограничение внешнего ключа в таблице housetbl, то вставка проходит нормально. С базой работает несколько программ. Раньше такого не наблюдалось, можно было свободно вставлять таким образом записи в таблицу. Пробовали перезапускать службу сервера, результат тот же. Что вообще означает это сообщение об ошибке? Можно ли как-то отследить, что может вызывать подобную блокировку? Или причина в чем-то ещё? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 10:49 |
|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
fortress, Это не блокировка. У вас проблема с правами доступа к таблице для проверки foreign key. Смотрите в \dp, используемых юзеров и выдайте недостающие grant'ы. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 10:55 |
|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
Melkij, Спасибо за ответ. Права могли измениться администраторами БД. Проверяю с учетной записью пользователя postgres, права стояли такие: Код: 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.
Дал все права (grant all ...) пользователю postgres для таблиц streetbl и housetbl (и их индексов): Код: 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.
Пока по-прежнему не получается добавить запись: Код: plsql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 11:20 |
|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
fortress, Владелец таблицы housetbl должен иметь привилегии для таблицы streettbl. Судя по всему владелец - operatorsn и у него не хватает UPDATE и DELETE. Должно помочь: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 12:35 |
|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
Павел ЛузановДолжно помочь: Код: sql 1.
Действительно помогло. Теперь работает, спасибо! Павел ЛузановВладелец таблицы housetbl должен иметь привилегии для таблицы streettbl. Судя по всему владелец - operatorsn и у него не хватает UPDATE и DELETE. Про такое поведение не подозревал, полагая что все запросы выполняются с правами текущего пользователя. Видимо это связано с работой внутренних механизмов PostgreSQL по обеспечению целостности? По каким ключевым словам можно найти описание этого механизма? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 13:19 |
|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
fortress, Сказать по-честному, не могу найти в документации где про это написано. Можно поискать в исходном коде, но верю тому, что пишет Том Лэйн в похожем случае: Том...query will be run with the permissions of the owner of the table, so it's that user (not necessarily the one doing the INSERT) who lacks permissions. Проверка внешнего ключа выполняется запросом: Код: sql 1.
Выполнять её с правами пользователя, вызвавшего оригинальный запрос(insert) неправильно. Ведь для работы с определенной таблицей (housetbl) пользователь необязан иметь права на работу с таблицами, на которые она ссылается (streettbl). Значит нужно выполнять проверку с правами другого пользователя. Выбор пал на владельца таблицы, что вполне логично. Кстати, не проверял, но подозреваю, что для выполнения проверочного запроса достаточно привилегий SELECT и UPDATE (для установки разделяемой блокировки FOR KEY SHARE). У вас не хватало UPDATE. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 14:27 |
|
Блокировка при вставке записи в таблицу
|
|||
---|---|---|---|
#18+
Павел Лузанов, Спасибо за разьяснения. Павел ЛузановКстати, не проверял, но подозреваю, что для выполнения проверочного запроса достаточно привилегий SELECT и UPDATE (для установки разделяемой блокировки FOR KEY SHARE). У вас не хватало UPDATE.Проверил - всё так. При наличии только SELECT ошибка ещё остается, если добавить ещё привелегию UPDATE то всё работает. Резюмируя выше описанное, могу заключить что для вставки в таблицу записей у её владельца должны быть привелегии SELECT и UPDATE на таблицу, с которой у неё связь через внешний ключ. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.02.2019, 15:26 |
|
|
start [/forum/topic.php?fid=53&msg=39771054&tid=1995357]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
49ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
42ms |
get tp. blocked users: |
1ms |
others: | 17ms |
total: | 150ms |
0 / 0 |