鉴于我有一个表
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
及其分区的结果。
(由于缺乏声誉,我无法发布图片,所以请点击链接)
当我尝试使用此命令禁用表上的触发器
users
时:
alter table users disable trigger all;
我遇到了这个错误:
ERROR: trigger "RI_ConstraintTrigger_c_572918" for table "users_0" does not exist
我的假设: 我猜想禁用所有触发器的命令将传播到所有分区,因为此命令仅在该表上禁用触发器会起作用:
alter table only users disable trigger all; -- ALTER TABLE
但是,我不明白为什么 PostgreSQL 试图禁用分区上不存在的触发器?这是一个错误吗?
如果您暂时禁用触发器,则有一个针对当前会话的设置,而不是调用您拥有的命令。
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";