Subject: DISABLE TRIGGER doc wrong?

From: Dominique Devienne <[email-masked]>
Date: Mon, 25 Aug 2025 18:19:19 +0200

or I'm reading it wrong? --DD

>From https://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-DESC-DISABLE-ENABLE-TRIGGER:
> Disabling or enabling internally generated constraint triggers requires superuser privileges

We were disabling triggers as the owner of the table just fine, no
SUPERUSER involved. So is the doc out-of-date?

PS: By mistake... We were ALTER TABLE {}.{} DISABLE TRIGGER ALL
  when we meant ALTER TABLE {}.{} DISABLE TRIGGER USER

---

From: Pavel Luzanov <[email-masked]>
Date: Mon, 25 Aug 2025 20:13:50 +0300

On 25.08.2025 19:19, Dominique Devienne wrote:
> Fromhttps://www.postgresql.org/docs/current/sql-altertable.html#SQL-ALTERTABLE-DESC-DISABLE-ENABLE-TRIGGER:
Simple experiment shows that it is still up to date:

postgres@postgres(17.5)=# set session authorization alice;
SET
alice@postgres(17.5)=> create table t (id int primary key, parent_id int 
references t(id));
CREATE TABLE
alice@postgres(17.5)=> select tgname from pg_trigger where tgrelid = 
't'::regclass;
              tgname
--------------------------------
  RI_ConstraintTrigger_a_1260370
  RI_ConstraintTrigger_a_1260371
  RI_ConstraintTrigger_c_1260372
  RI_ConstraintTrigger_c_1260373
(4 rows)

alice@postgres(17.5)=> alter table t disable trigger 
"RI_ConstraintTrigger_a_1260370";
ERROR:  permission denied: "RI_ConstraintTrigger_a_1260370" is a system 
trigger
alice@postgres(17.5)=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres@postgres(17.5)=# alter table t disable trigger 
"RI_ConstraintTrigger_a_1260370";
ALTER TABLE

-- 
Pavel Luzanov
Postgres Professional:https://postgrespro.com

---

From: Dominique Devienne <[email-masked]>
Date: Mon, 25 Aug 2025 19:24:06 +0200

> alice@postgres(17.5)=> alter table t disable trigger "RI_ConstraintTrigger_a_1260370";
> ERROR:  permission denied: "RI_ConstraintTrigger_a_1260370" is a system trigger
> postgres@postgres(17.5)=# alter table t disable trigger "RI_ConstraintTrigger_a_1260370";
> ALTER TABLE

We were using ALL, successfully but incorrectly, and are now using
USER, successfully.
Not a named constraint trigger as you did. Could it be ALL implicitly
excludes such constraint triggers, when not SUPERUSER? And thus, as
the table owner, ALL == USER, implicitly? If that's the case, then the
doc still needs clarifications IMHO. --DD

---

From: Adrian Klaver <[email-masked]>
Date: Mon, 25 Aug 2025 10:33:35 -0700

> doc still needs clarifications IMHO. --DD

I am not seeing it:

select version();
                                                               version 

-----------------------------------------------------------------------------------------------------------------------------------
  PostgreSQL 17.6 (Ubuntu 17.6-1.pgdg22.04+1) on x86_64-pc-linux-gnu, 
compiled by gcc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0, 64-bit

create table test_table_parent(id integer primary key, fld varchar);
create table test_table_child(id integer primary key, fld_child varchar, 
parent_id integer references test_table_parent on update cascade);

\dt+ test_table_child
                                             List of tables
  Schema |       Name       | Type  |  Owner  | Persistence | Access 
method |    Size    | Description
--------+------------------+-------+---------+-------------+---------------+------------+-------------
  public | test_table_child | table | db_user | permanent   | heap 
    | 8192 bytes | NULL

\du+ db_user
             List of roles
  Role name | Attributes | Description
-----------+------------+-------------
  db_user   |            |

alter table test_table_child disable  trigger all;
ERROR:  permission denied: "RI_ConstraintTrigger_c_121933" is a system 
trigger

-- 
Adrian Klaver
[email-masked]