【问题标题】:Postgresql permissions for disable/enable trigger all用于禁用/启用触发所有的 Postgresql 权限
【发布时间】: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”是系统触发器。

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

【问题讨论】:

    标签: sql postgresql flyway


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 实际上真正的问题是摆脱约束/外键错误。我们该如何处理?
    • 我不明白:您是要禁用外键约束还是要禁用所有其他触发器同时避免错误消息?
    • 我想禁用外键约束。为此,我读到我可以禁用全部触发。但是当我尝试它时,我得到了一个错误。如果有另一种禁用外键约束的方法,我也可以试试?
    • 除非您是超级用户,否则除了删除外键约束之外,没有其他方法可以禁用它。
    • 我也试试这个。 SET session_replication_role TO 'replica' 仍然有一些权限错误。我想我必须使用超级用户来禁用约束。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-22
    • 2017-04-07
    • 2018-09-29
    • 1970-01-01
    • 2014-04-24
    • 2013-04-29
    • 1970-01-01
    相关资源
    最近更新 更多