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

yc0p9oo0  于 2023-04-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(105)

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吗?

i86rm4rw

i86rm4rw1#

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

SET session_replication_role = replica;

这会让它倒退。

SET session_replication_role = DEFAULT;

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

alter table "users_0" disable trigger "RI_ConstraintTrigger_c_572918";

相关问题