czytanie manuali popłaca

eh. od dawna mi tego brakowało w postgresie. i okazało się, że niepotrzebnie, bo już od 8.1 jest! wyłączanie triggerów. pojedynczo. każdy można tymczasowo wyłączyć.
na wypadek gdybyście nie wiedzieli:

# ALTER TABLE test DISABLE TRIGGER xxx;

gdzie xxx to nazwa triggera, lub słowo "ALL" jeśli chcemy wyłączyć wszystkie triggery, lub słowo "USER" jeśli chcemy wyłączyć wszystkie triggery, ale pozostawić działające klucze obce (które są realizowane triggerami).
włączenie z powrotem to:

# ALTER TABLE test ENABLE TRIGGER xxx;

jedynym problemem z tym polega na tym, że w psql'u, przy robieniu \d tabeli nie widać które triggery są wyłączone:

# create table x (id serial primary key, wstawiana text);
# CREATE TRIGGER test AFTER INSERT OR UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test();
# CREATE TRIGGER test_u AFTER UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test_u();
# alter table x disable trigger test;
# \d x
                           Table "public.x"
  Column   |  Type   |                   Modifiers
-----------+---------+------------------------------------------------
 id        | integer | not null default nextval('x_id_seq'::regclass)
 wstawiana | text    |
Indexes:
    "x_pkey" PRIMARY KEY, btree (id)
Triggers:
    test AFTER INSERT OR UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test()
    test_u AFTER UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test_u()

można sobie ręcznie sprawdzić które triggery są wyłączone:

# select t.tgname, t.tgenabled from pg_class c join pg_trigger t on c.oid = tgrelid where c.relname = 'x';
 tgname | tgenabled
--------+-----------
 test_u | t
 test   | f
(2 rows)

w 8.3 na szczęście jest to już poprawione:

# \d x
                           Table "public.x"
  Column   |  Type   |                   Modifiers
-----------+---------+------------------------------------------------
 id        | integer | not null default nextval('x_id_seq'::regclass)
 wstawiana | text    |
Indexes:
    "x_pkey" PRIMARY KEY, btree (id)
Triggers:
    test_u AFTER UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test_u()
Disabled triggers:
    test AFTER INSERT OR UPDATE ON x FOR EACH ROW EXECUTE PROCEDURE test()

słodko 🙂

One thought on “czytanie manuali popłaca”

  1. albowiem dokumentacja jest jak seks: jak jest dobra, to jest na prawdę bardzo, bardzo dobra,
    a jak jest kiepska, to jest lepsza niż żadna

Comments are closed.