用于禁用/启用触发所有的 Postgresql 权限

Posted

技术标签:

【中文标题】用于禁用/启用触发所有的 Postgresql 权限【英文标题】:Postgresql permissions for disable/enable trigger all 【发布时间】:2021-07-26 00:37:59 【问题描述】:

我需要为我的表禁用触发器和约束/外键关系以进行迁移。我正在使用 flyway 进行迁移。

所以我想创建除超级用户之外的其他用户。并让新用户能够禁用/启用给定架构的所有触发器/约束。

所以我尝试了这个:

CREATE USER "MY_USER" WITH PASSWORD 'password';
GRANT ALL PRIVILEGES ON DATABASE postgres to "MY_USER";

create schema "MY_SCHEMA";

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA "MY_SCHEMA" TO "MY_USER";
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA "MY_SCHEMA" TO "MY_USER";
GRANT ALL PRIVILEGES ON SCHEMA "MY_SCHEMA" TO "MY_USER";

但是当我使用 MY_USER 并尝试运行此脚本时:

ALTER TABLE "MY_SCHEMA".TBLTABLE
     DISABLE TRIGGER ALL;

我收到错误:权限被拒绝:“RI_ConstraintTrigger_c_16434”是系统触发器。

当我使用超级用户尝试这个脚本时,我可以运行它。但我不能用我创建的用户运行它。 有什么建议吗?

【问题讨论】:

【参考方案1】:

您需要成为超级用户才能在表上禁用“系统触发器”。

原因是这些触发器实现了外键关系,禁用此类触发器会使数据库暴露在不一致的情况下。不相信凡人会执行此类操作。

您可以按名称禁用每个正常触发器。

如果您的目标是禁用外键约束,那么您就很不走运:非超级用户可以做到这一点的唯一方法是删除约束。

【讨论】:

实际上真正的问题是摆脱约束/外键错误。我们该如何处理? 我不明白:您是要禁用外键约束还是要禁用所有其他触发器同时避免错误消息? 我想禁用外键约束。为此,我读到我可以禁用全部触发。但是当我尝试它时,我得到了一个错误。如果有另一种禁用外键约束的方法,我也可以试试? 除非您是超级用户,否则除了删除外键约束之外,没有其他方法可以禁用它。 我也试试这个。 SET session_replication_role TO 'replica' 仍然有一些权限错误。我想我必须使用超级用户来禁用约束。

以上是关于用于禁用/启用触发所有的 Postgresql 权限的主要内容,如果未能解决你的问题,请参考以下文章

禁用或启用数据库所有触发器

Oracle启用和禁用触发器

PostgreSQL 日志触发器/函数查询数据

如何仅在一个事务中禁用 PostgreSQL 触发器?

禁用触发器的N种方法

oracle中查询表中的触发器,关闭启用操作