SequelizeDatabaseError: отказано в разрешении для отношения note_opened_tbl - PullRequest
2 голосов
/ 29 февраля 2020

Я создал новую таблицу в Postgres, и у меня возникают проблемы с доступом к ней с помощью Sequelize. Я уже ПРЕДОСТАВИЛ все разрешения для таблицы теоретически, и я могу использовать ту же учетную запись для доступа к таблице через мою БД GUI.

Требуется ли какое-либо дополнительное разрешение для этой связи?

Executing (default): SELECT date_trunc('day', "created_at"), COUNT("id") AS "COUNT" FROM "notice_opened_tbl" AS "notice_opened_tbl" WHERE "notice_opened_tbl"."merchant_id" = 40 GROUP BY date_trunc('day', "created_at") ORDER BY date_trunc('day', "created_at") ASC;
(node:45) UnhandledPromiseRejectionWarning: SequelizeDatabaseError: permission denied for relation notice_opened_tbl

РЕДАКТИРОВАТЬ: текущие разрешения - как вы можете видеть, они выглядят правильно. Пользователь, с которым я сейчас пытаюсь связаться, - это postgresadmin (будет изменен до производства)

permissions

РЕДАКТИРОВАТЬ: Я не думаю, что это связано к разрешениям - я перепробовал практически все, что с ними связано, , и запрос работал, когда я подключался к базе данных с моей локальной машины, но не с dev . Проблема только в этой только что созданной таблице.

Кроме того, это на AWS, если это кому-нибудь помогает

Вот моя настройка dev - все запросы, НО запрос, включающий новую Таблица работает отсюда:

const sequelize = new Sequelize(
    process.env.DATABASE_NAME || "DATABASENAMEHERE",
    process.env.DATABASE_USERNAME || "postgresadmin",
    process.env.DATABASE_PASSWORD || "PASSWORDHERE",
    {
        host: process.env.DATABASE_HOST || "postgres",
        dialect: "postgres",
        port: process.env.DATABASE_PORT || 5432,
        pool: {
            max: 10,
            min: 0,
            acquire: 30000,
            idle: 10000,
        },
        define: {
            timestamps: false,
        },
    });

Вот моя локальная установка, которая работает с моей локальной машины - запрос отсюда работает:

const sequelize = new Sequelize(
    process.env.DATABASE_NAME || "DATABASEHERE",
    process.env.DATABASE_USERNAME || "postgresadmin",
    process.env.DATABASE_PASSWORD || "PASSWORDHERE",
    {
        host: process.env.DATABASE_HOST || "localhost",
        dialect: "postgres",
        port: process.env.DATABASE_PORT || 5465,
        pool: {
            max: 10,
            min: 0,
            acquire: 30000,
            idle: 10000,
        },
        define: {
            timestamps: false,
        },
    });

В dev, host - postgres поскольку это служба Kubernetes, связанная с подключением к базе данных

Вот код запроса (он еще не очищен):

let merchantId = parseInt(req.param("merchantId"), 10);
let noticeWhere = {
       merchant_id: merchantId,
    };
    if (req.query.startdate && req.query.enddate) {
        // @ts-ignore
        noticeWhere.created_at = {
            [Op.between]: [req.query.startdate, req.query.enddate]
        };

    }

    let noticesOpened = NoticeOpened.aggregate(
        "id",
        "COUNT", {
            plain: false,
            where: noticeWhere,
            group: [sequelize.fn("date_trunc", "day", sequelize.col("created_at"))],
            order: [
                [sequelize.fn("date_trunc", "day", sequelize.col("created_at")), "ASC"]
            ],
        });
    return noticesOpened;

Вывод YAML для службы postgres Kubernetes :

apiVersion: v1
kind: Service
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"creationTimestamp":"2019-07-21T02:44:44Z","name":"postgres","namespace":"default","resourceVersion":"169556","selfLink":"/api/v1/namespaces/default/services/postgres","uid":"7ef0a60f-ab61-11e9-8d66-06505b5dee68"},"spec":{"externalName":"URLHERE","ports":[{"port":5432,"protocol":"TCP","targetPort":5432}],"sessionAffinity":"None","type":"ExternalName"},"status":{"loadBalancer":{}}}
  creationTimestamp: 2019-11-23T00:07:00Z
  name: postgres
  namespace: default
  resourceVersion: "14358655"
  selfLink: /api/v1/namespaces/default/services/postgres
  uid: 2c1a58a4-0d85-11ea-a8cb-02dead532c7a
spec:
  externalName: URLHERE
  ports:
  - port: 5432
    protocol: TCP
    targetPort: 5432
  sessionAffinity: None
  type: ExternalName
status:
  loadBalancer: {}

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Разрешение отклонено для ошибки отношения - это общая ошибка PostgreSQL, означающая, что пользователь, подключенный к базе данных, не имеет доступа для записи или чтения указанной таблицы c.

ПРИВИЛЕГИИ ПО УМОЛЧАНИЮ не изменяют разрешения для существующих объектов. Они являются привилегиями по умолчанию для вновь создаваемых объектов и только для конкретной роли, к которой они принадлежат. Если вы не определили роль при запуске ALTER DEFAULT PRIVILEGES, по умолчанию используется текущая роль (при выполнении оператора ALTER DEFAULT PRIVILEGES.

Распространенные причины этой ошибки:

  • Если вы создали новые учетные данные для своей базы данных, вам необходимо настроить соответствующие разрешения для этой скважины учетных данных.

  • Пределы строк также могут быть причиной эта ошибка.

Предоставить все привилегии на всех таблицах в SCHEMA publi c TO someuser;

вы можете просто переместить этот GRANT ALL. запросите весь путь до самого дна (точка, где вы создали всю необходимую таблицу для вашей базы данных). Вы можете проверить ссылку

0 голосов
/ 03 марта 2020

Попробуйте выполнить следующее:

Заполните SCHEMANAME

GRANT USAGE ON SCHEMA SCHEMANAME TO postgresadmin;

GRANT SELECT, INSERT, UPDATE, DELETE ON notice_opened_tbl IN SCHEMA SCHEMANAME TO postgresadmin;

GRANT SELECT, UPDATE, USAGE ON ALL SEQUENCES IN SCHEMA SCHEMANAME to postgresadmin

GRANT ALL PRIVILEGES ON TABLE notice_opened_tbl TO postgresadmin;
...