SET session_replication_role = replica;
Es funktioniert nicht mit PostgreSQL 9.4 auf meinem Linux-Rechner ändern und funktioniert, wenn i Tabelle durch gewöhnliche Abfrage ändern. Manuelle Änderungen in der Tabelle pg_trigger funktionieren auch ohne Neustart des Servers nicht, aber dynamische Abfragen wie postgresql.nabble.com ENABLE/DISABLE ALL TRIGGERS IN DATABASE funktionieren. Es könnte nützlich sein, wenn Sie etwas tun müssen.
Zum Beispiel, wenn Sie Tabellen in einem bestimmten Namensraum haben könnte es sein:
create or replace function disable_triggers(a boolean, nsp character varying) returns void as
$$
declare
act character varying;
r record;
begin
if(a is true) then
act = 'disable';
else
act = 'enable';
end if;
for r in select c.relname from pg_namespace n
join pg_class c on c.relnamespace = n.oid and c.relhastriggers = true
where n.nspname = nsp
loop
execute format('alter table %I %s trigger all', r.relname, act);
end loop;
end;
$$
language plpgsql;
Wenn Sie alle Trigger mit bestimmten Trigger-Funktion deaktivieren möchten könnte es sein:
create or replace function disable_trigger_func(a boolean, f character varying) returns void as
$$
declare
act character varying;
r record;
begin
if(a is true) then
act = 'disable';
else
act = 'enable';
end if;
for r in select c.relname from pg_proc p
join pg_trigger t on t.tgfoid = p.oid
join pg_class c on c.oid = t.tgrelid
where p.proname = f
loop
execute format('alter table %I %s trigger all', r.relname, act);
end loop;
end;
$$
language plpgsql;
PostgreSQL-Dokumentation system catalogs
Es gibt einen anderen contr ol Optionen des Trigger-Brennprozesses:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - Der Trigger wird nur im Replica-Modus ausgelöst.
ALTER TABLE ... ENABLE IMMER TRIGGER ... - Trigger wird ausgelöst, immer (natürlich)
Genau das, was ich gesucht habe für, danke! –
Und wie "berechnen Sie dann alle Triggeränderungen neu"? –
Vorsicht bei gleichzeitigem Laden: 'ALTER TABLE ... DISABLE TRIGGER USER' benötigt eine exklusive Sperre für die Tabelle. –