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", вам нужно:

  1. Найдите владельца базы данных. Это можно сделать с помощью команды \l в psql
  2. .
  3. Войдите в эту учетную запись (или в учетную запись, которая имеет возможность предоставлять все привилегии, которые вы хотите предоставить. Но помните о наследовании привилегий и о том, как это работает/используйте роль)
  4. Подключитесь к "my_db" с помощью \c "my_db"
  5. .
  6. И повторно выполните исходную команду

Кроме того, если предполагается, что "django" будет единственным пользователем базы данных/каталога, можно сделать его владельцем

Вернуться на верх