繁体   English   中英

在 GCP 上的表上禁用触发器

[英]disable trigger on table on GCP

我正在进行数据库迁移,我需要禁用表上的外键约束才能和平迁移。

从这里: 如何暂时禁用 PostgreSQL 中的触发器?

我收集到我需要超级用户权限才能运行:

SET session_replication_role = replica;

SET session_replication_role = DEFAULT;

然而; 在谷歌云平台上,不可能获得文档中详述的那些特权:

postgres 用户是 cloudsqlsuperuser 角色的一部分,具有以下属性(权限):CREATEROLE、CREATEDB 和 LOGIN。 它没有 SUPERUSER 或 REPLICATION 属性

以及这个 StackOverflow 问题: upgrade user to superuser in postgres google cloud

我还尝试通过以下方式禁用触发器:

alter table orders.orders disable trigger all;

然而; 为此,在我看来,我还需要 su 权限: ERROR: permission denied: "RI_ConstraintTrigger_a_25017" is a system trigger

那么,解决方案是什么,我什至可以禁用触发器 // 这个特定表上的外键约束吗?

实际上你不需要超级用户来发布

SET session_replication_role = replica;
SET session_replication_role = default;

你只需要复制(我刚刚测试过)

ALTER ROLE <your user> REPLICATION;

就像您从文档中看到的一样,这些命令需要superuser权限,而 CloudSQL 中的用户尚不具备这些权限。

由于 PostgreSQL 的 Cloud SQL 是一项托管服务,因此它限制了对某些需要高级权限的系统过程和表的访问。

实际上有一个开放的功能请求专注于此功能。 根据可用信息,它似乎还没有 ETA。 无论如何,正如该线程所说,似乎有些复制服务不需要superuser 否则,GCP 还提供 数据迁移服务,根据文档,该服务支持迁移 PostgreSQL 实例的外键约束。

没有办法获得超级用户权限,但您可以通过设置正确的数据库标志来获得一些超级用户权限。

引用文档: https://cloud.google.com/sql/docs/postgres/flags#session_replication_role

session_replication_role PostgreSQL 有一个 session_replication_role 标志,该标志旨在用于逻辑复制,并允许在单个会话中禁用约束触发器。

有时这个标志也可以用于一些维护操作来规避约束(最常见的是外键)检查。

任何设置了 REPLICATION 属性的用户都可以在 session 中设置此标志。 当为实例设置标志 cloudsql.enable_pglogical 或 cloudsql.logical_decoding 之一时,cloudsqlsuperuser 可以设置任何用户的 REPLICATION 属性。

如何在数据库中设置标志非常简单,并在此处进行了解释: https://cloud.google.com/sql/docs/postgres/flags#set_a_database_flag适用于所有情况(控制台、gcloud、terraform 等)

什么对我有用

我在尝试解决同样的问题时找到了上述解决方案。 然而,正如@Paolo Castelletti 所说,

ALTER ROLE <your user> REPLICATION;

实际上足以让我申请

SET session_replication_role = replica;

我也想分享另一种方法,以防它对某人有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM