用于禁用/启用触发所有的 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 权限的主要内容,如果未能解决你的问题,请参考以下文章