为什么我不能在已分区的表上禁用触发器?

问题描述 投票:0回答:1

鉴于我有一个表

users
对另一个表有引用约束,
activities
,如下所示:

CREATE TABLE activities (
  id INT PRIMARY KEY,
  activity_name VARCHAR(50)
);

CREATE TABLE users (
  id INT PRIMARY KEY,
  username VARCHAR(50),
  activity_id INT,
  FOREIGN KEY (activity_id) REFERENCES activities(id)
)
PARTITION BY RANGE (id) (
  PARTITION p0 VALUES LESS THAN (100),
  PARTITION p1 VALUES LESS THAN (200),
  PARTITION p2 VALUES LESS THAN (300),
  PARTITION p3 VALUES LESS THAN MAXVALUE
);

以下是

\dS+
命令对表
users
及其分区的结果。

(由于缺乏声誉,我无法发布图片,所以请点击链接)

https://i.stack.imgur.com/miMW9.png

https://i.stack.imgur.com/QK1K0.png

当我尝试使用此命令禁用表上的触发器

users
时:

alter table users disable trigger all;

我遇到了这个错误:

ERROR:  trigger "RI_ConstraintTrigger_c_572918" for table "users_0" does not exist

https://i.stack.imgur.com/C4LBe.png

我的假设: 我猜想禁用所有触发器的命令将传播到所有分区,因为此命令仅在该表上禁用触发器会起作用:

alter table only users disable trigger all; -- ALTER TABLE

但是,我不明白为什么 PostgreSQL 试图禁用分区上不存在的触发器?这是一个错误吗?

postgresql foreign-keys database-partitioning
1个回答
0
投票

如果您暂时禁用触发器,则有一个针对当前会话的设置,而不是调用您拥有的命令。

SET session_replication_role = replica;

这将使它恢复原状。

SET session_replication_role = DEFAULT;

http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/


要禁用所有会话的触发器...请使用您的命令。

您可能在一个分区上为该触发器设置了特殊字符(引号)。我不确定为什么。为了调用触发器命令,您需要使用相同的特殊字符。您可能需要为每个分区调用禁用。如果您在分区上看不到触发器的名称,请一次执行一个并继续调用您的命令以获取后续分区上的错误。我不完全确定这会解决您的问题。如果没有,希望有人会回答知道。

https://www.postgresql.org/docs/8.2/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS

alter table "users_0" disable trigger "RI_ConstraintTrigger_c_572918"; 
© www.soinside.com 2019 - 2024. All rights reserved.