Postgres版本:PostgreSQL 15.2 on aarch 64-apple-darwin 21.6.0,由Apple clang版本14.0.0(clang-1400.0.29.102)编译,64位
表users
具有对表activities
的引用约束:
CREATE TABLE activities (
id INT PRIMARY KEY,
activity_name VARCHAR(50)
);
CREATE TABLE users (
id INT,
username VARCHAR(50),
activity_id INT,
FOREIGN KEY (activity_id) REFERENCES activities(id)
) PARTITION BY RANGE (id);
CREATE TABLE users_0 PARTITION OF users
FOR VALUES FROM (0) TO (100);
CREATE TABLE users_1 PARTITION OF users
FOR VALUES FROM (100) TO (200);
CREATE TABLE users_2 PARTITION OF users
FOR VALUES FROM (200) TO (300);
CREATE TABLE users_3 PARTITION OF users
FOR VALUES FROM (300) TO (MAXVALUE);
下面是对表users
及其分区执行\dS+
命令的结果。
x一个一个一个一个x一个一个二个x
当我尝试使用以下命令禁用表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似乎使用原始表中的触发器名称并将其传播到分区,但由于这样的命名差异,它永远不会正常工作。
下面是我列出原始表users
及其分区上的触发器的结果。
-- original table
test=# SELECT
tgname AS trigger_name
FROM
pg_trigger
WHERE
tgrelid = 'users'::regclass
ORDER BY
trigger_name;
trigger_name;
RI_ConstraintTrigger_c_572918
RI_ConstraintTrigger_c_572919
-- partition
test=# SELECT
tgname AS trigger_name
FROM
pg_trigger
WHERE
tgrelid = 'users_0'::regclass
ORDER BY
trigger_name;
trigger_name
RI_ConstraintTrigger_c_572924
RI_ConstraintTrigger_c_572925
我很惊讶PostgreSQL试图在分区上禁用一个不存在的触发器。这是一个bug吗?
1条答案
按热度按时间i86rm4rw1#
如果暂时禁用触发器,则会有针对当前会话的设置,而不是调用您拥有的命令。
这会让它倒退。
http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
要禁用所有会话的触发器...请使用您的命令。
你可能有特殊的性格(引号)为一个分区上的那个触发器。我不知道为什么。为了调用触发器的命令,你需要使用相同的特殊字符。你可能需要为每个分区调用disable。如果你在分区上看不到触发器的名称,一次做一个,并不断调用您的命令来获取后续分区上的错误。我不完全确定这将解决您的问题。如果没有,希望有人会回答,知道。
https://www.postgresql.org/docs/8.2/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS