January 22nd, 2007 by depesz | Tags: | 1 comment »
Did it help? If yes - maybe you can help me?

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 🙂

  1. One comment

  2. # cezio
    Jan 23, 2007

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

Leave a comment