我正在使用 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
您不应该修改 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;
但是当您之后重新启用触发器时,不会检查外键。这可能会导致数据库中的外键无效/不一致。
对于 Postgres :-
使用以下方法更容易禁用所有触发器:
SET session_replication_role = '副本';
迁移后重新启用所有
SET session_replication_role = 'origin';
我将假设您已经将
pg_dump
与 --disable-triggers
标志一起使用,现在您正在尝试将该转储恢复到您的 RDS 实例。
最简单的做法是运行转储命令,然后打开转储文件(应该是一个大的 SQL 文件)并将其放在第一行:
SET session_replication_role = 'replica';
然后把这个放在最后一行:
SET session_replication_role = 'origin';
如其他答案中所述,这有缺点,但这是解决逐表禁用触发器的最简单方法。