Postgres15 Grant All on schema public не работает
Раньше мой код отлично работал с postgres 12, теперь с postgres 15 мой проект django не может запустить миграции. Я нашел много ответов, предлагающих GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO <user>
, но у меня это не работает, как показано ниже.
Вот какую ошибку я получаю:
lib/python3.11/site-packages/psycopg/cursor.py", line 732, in execute
raise ex.with_traceback(None)
psycopg.errors.InsufficientPrivilege: permission denied for schema public
LINE 1: CREATE TABLE "django_migrations" ("id" smallint NOT NULL PRI...
Ниже пользователь с именем django
должен иметь возможность создавать таблицы в схеме public
, чтобы он мог запускать миграции:
sudo -u postgres psql
could not change directory to "/home/john/project/src": Permission denied
psql (15.6 (Debian 15.6-0+deb12u1))
Type "help" for help.
postgres=# GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO django;
GRANT
postgres=#
\q
(project) john@vps-demo:~/project/src$ psql -U django my_db
Password for user django:
psql (15.6 (Debian 15.6-0+deb12u1))
Type "help" for help.
my_db=> CREATE TABLE test_table1 (id INT);
ERROR: permission denied for schema public
LINE 1: CREATE TABLE test_table1 (id INT);
^
my_db=>
И проверка разрешений:
User
# sudo -u postgres psql -c "\dn+ public"
could not change directory to "/home/john/project/install": Permission denied
List of schemas
Name | Owner | Access privileges | Description
--------+-------------------+----------------------------------------+------------------------
public | pg_database_owner | pg_database_owner=UC/pg_database_owner+| standard public schema
| | =U/pg_database_owner +|
| | django=UC/pg_database_owner +|
| | john=UC/pg_database_owner |
(1 row)
Вы предоставляете django все права на публичную схему/пространство имен в базе данных "postgres", а не в базе данных/каталоге "my_db".
В первой команде вы вошли в базу данных/каталог "postgres". Во второй команде вы пытаетесь создать таблицу в базе данных/каталоге "my_db"
Итак, если вы хотите предоставить "django" доступ к "my_db", вам нужно:
- Найдите владельца базы данных. Это можно сделать с помощью команды
\l
в psql .
- Войдите в эту учетную запись (или в учетную запись, которая имеет возможность предоставлять все привилегии, которые вы хотите предоставить. Но помните о наследовании привилегий и о том, как это работает/используйте роль)
- Подключитесь к "my_db" с помощью
\c "my_db"
.
- И повторно выполните исходную команду
Кроме того, если предполагается, что "django" будет единственным пользователем базы данных/каталога, можно сделать его владельцем