如何关闭 Amazon RDS for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版中的外键或触发器?

1 分钟阅读
0

我想关闭我的 Amazon Relational Database Services (Amazon RDS) for PostgreSQL 或 Amazon Aurora PostgreSQL 兼容版数据库实例的外键检查。

简短描述

PostgreSQL 未提供启用或关闭外键约束的直接功能。当您在 PostgreSQL 中的某个表上创建外键时,PostgreSQL 会创建一个内部触发器来检查数据完整性。要关闭外键约束,您必须具有超级用户权限来删除 PostgreSQL 创建的内部触发器。

当您运行以下命令来关闭表上的所有触发器时,您会收到 permission denied(权限被拒绝)错误:

ALTER TABLE TestTable DISABLE TRIGGER ALL;
Error report -
ERROR: permission denied: "RI_ConstraintTrigger_c_9999181" is a system trigger

由于 RDS for PostgreSQL 和 Aurora PostgreSQL 兼容版为托管服务,因此它们不允许任何超级用户权限,即使是主用户也是如此。不允许使用 ALTER TABLE 'tablename' DISABLE TRIGGER ALL; 命令。

解决方法

**注意:**如果未启用触发器,约束完整性可能会受到影响。此外,session_replication_role 配置变量会影响激活触发器的机制。当为复制角色 originlocal 启用触发器时,触发器将启动。有关详细信息,请参阅 PostreSQL 网站上的 session_replication_role (enum)

将 session_replication_role 更改为 replica

要关闭 RDS for PostgreSQL 或 Aurora PostgreSQL 兼容版中的外键约束,请将 session_replication_role 参数从 origin 更改为 replica。当将此参数更改为 replica 时,将允许 pg_restore 或 pgloader 在表中插入或更新数据。

要将 session_replication_role 更改为 replica,请使用以下选项之一:

  • 如果您使用 pgadmin 或 PostgreSQL 会话,请运行以下命令,以便不会启动内部强制引用的系统触发器:
postgres=> set session_replication_role = replica;

注意: 此更改仅对当前会话有效。

注意: 完成操作后,将 session_replication_role 参数恢复为 origin。如果未将 session_replication_role 更改回 origin,则您可能会在其他表中遇到引用完整性问题。

删除表上的外键约束

要在没有超级用户权限的情况下关闭触发器,请运行以下命令删除表上的外键约束:

Alter table table_name drop constraint key_name;

table_name 替换为数据库中的表名称,将 key_name 替换为表中的键名称。有关详细信息,请参阅 PostgreSQL 网站上的 ALTER TABLE

相关信息

如何为我的 Amazon RDS for MySQL 数据库实例开启函数、过程和触发器?

使用 PostgreSQL 数据库作为 AWS Database Migration Service 的目标

PostreSQL 网站上的 session_replication_role 'replica' behavior

AWS 官方
AWS 官方已更新 3 个月前