如何在 postgresql 中禁用外键约束

问题描述 投票:0回答:3

我正在使用 AWS Aurora Postgres 并使用 DMS 从 RDS postgres 迁移到 Aurora PG。为了执行 FULL LOAD,我想在所有对象上禁用外键约束和触发器。我能够禁用触发器,但找不到禁用约束的方法。

以下不起作用:

更改表 so_items 禁用约束 so_items_so_id_fkey;

它抛出:

ERROR:“CONSTRAINT”处或附近的语法错误 第 1 行:更改表 so_items 禁用约束 so_items_so_id_fkey; ^ SQL 状态:42601 性格:30

在参数组中设置“session_replication_role”=“replica”无效。虽然 DMS 任务尝试截断准备过程中的表部分,但它仍然因外键违规错误而失败。

请告知任何解决方法。

注意:我无法执行以下操作,因为在 RDS 中,即使使用主帐户我也无权执行此操作:

alter table so_items disable trigger ALL;

错误:权限被拒绝:“RI_ConstraintTrigger_c_16520”是系统触发器 SQL 状态:42501

postgresql postgresql-9.1 postgresql-9.4 amazon-aurora aws-dms
3个回答
12
投票

您不应该修改 Postgres 约束所依赖的触发器。这是一个你不应该关心的实现细节。

你不能禁用约束,真的。

要暂时关闭约束,您可以将约束检查推迟到交易结束时:

ALTER TABLE so_items ALTER CONSTRAINT so_items_so_id_fkey DEFERRABLE INITIALLY DEFERRED;

通过该修改,约束在当前事务结束时的修改之后进行评估。这将允许您打破交易内部的约束。

你可以

DROP CONSTRAINT
s

ALTER TABLE so_items DROP CONSTRAINT so_items_so_id_fkey;

这将永久删除它。

Edit:也可以禁用触发器,这也会影响表的外键约束

ALTER TABLE so_items DISABLE TRIGGER ALL;

但是当您之后重新启用触发器时,不会检查外键。这可能会导致数据库中的外键无效/不一致。


0
投票

对于 Postgres :-

使用以下方法更容易禁用所有触发器:

SET session_replication_role = '副本';

迁移后重新启用所有

SET session_replication_role = 'origin';


0
投票

我将假设您已经将

pg_dump
--disable-triggers
标志一起使用,现在您正在尝试将该转储恢复到您的 RDS 实例。

最简单的做法是运行转储命令,然后打开转储文件(应该是一个大的 SQL 文件)并将其放在第一行:

SET session_replication_role = 'replica';

然后把这个放在最后一行:

SET session_replication_role = 'origin';

如其他答案中所述,这有缺点,但这是解决逐表禁用触发器的最简单方法。

© www.soinside.com 2019 - 2024. All rights reserved.