【问题标题】:SequelizeDatabaseError: permission denied for relation notice_opened_tblSequelizeDatabaseError:关系notice_opened_tbl的权限被拒绝
【发布时间】:2020-06-13 09:51:20
【问题描述】:

我在 Postgres 中创建了一个新表,但在使用 Sequelize 访问它时遇到问题。理论上我已经授予了表的所有权限,我可以使用同一个帐户通过我的 DB 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(将在生产前更改)

编辑:我认为这与权限无关 - 我已经尝试了几乎所有与它们相关的东西,当我从本地计算机连接到数据库时,查询工作正常,但不是从 dev。不过,问题仅在于这张新创建的表。

另外,如果它对任何人有帮助,这在 AWS 上

这是我的开发设置 - 所有查询,但涉及新表的查询从这里开始:

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 中,主机是 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;

postgres Kubernetes 服务的 YAML 输出:

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: {}

【问题讨论】:

  • 您确定 sequelize 用户已授予对表的访问权限吗?可以执行SELECT grantee, privilege_type FROM information_schema.role_table_grants WHERE table_name='mytable'查看。
  • 已经检查过了。我将编辑答案以添加相关数据
  • @CecilRodriguez 您是否授予了 SCHEMA 的权限?
  • @Matt 这不是上面的 information_schema 吗?我将如何检查
  • @CecilRodriguez 您以什么用户身份登录?

标签: node.js postgresql kubernetes sequelize.js


【解决方案1】:

关系错误的权限被拒绝是一般 PostgreSQL 错误,这意味着连接到数据库的用户无权写入或读取特定表。

DEFAULT PRIVILEGES 不会更改现有对象的权限。它们是新创建对象的默认权限,并且仅适用于它们所属的特定角色。如果在运行 ALTER DEFAULT PRIVILEGES 时未定义角色,则默认为当前角色(执行 ALTER DEFAULT PRIVILEGES 语句时。

此错误的常见原因如下:

  • 如果您已为数据库创建了新凭据,则需要为该凭据配置适当的权限。

  • 行限制也可能是此错误的原因。

将 SCHEMA 中所有表的所有权限授予某些用户;

您可以简单地将 GRANT ALL.. 查询一直移动到底部(您为数据库创建所有必要表的位置)。你可以查看link

【讨论】:

  • 我已经多次运行 GRANT ALL... 命令,所以我认为不是这样
  • 可以确认。这对 Sequelize 没有任何影响。在 ORM 之外,一切都按预期工作。它必须在 Sequelize 配置中。
【解决方案2】:

尝试运行以下命令:

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;

【讨论】:

  • 仍然权限被拒绝(使用 SCHEMANAME 作为公共)。
猜你喜欢
  • 2013-03-09
  • 2019-12-18
  • 2016-02-25
  • 2014-04-30
  • 2014-08-19
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
相关资源
最近更新 更多