2010-10-15 8 views

Antwort

81

PostgreSQL kennt den ALTER TABLE tblname DISABLE TRIGGER USER Befehl, der zu tun scheint, was ich brauche. Siehe ALTER TABLE.

+0

Genau das, was ich gesucht habe für, danke! –

+0

Und wie "berechnen Sie dann alle Triggeränderungen neu"? –

+9

Vorsicht bei gleichzeitigem Laden: 'ALTER TABLE ... DISABLE TRIGGER USER' benötigt eine exklusive Sperre für die Tabelle. –

92

Alternativ, wenn Sie alle Trigger deaktivieren wollen, sind, nicht nur diejenigen auf der USER-Tabelle können Sie verwenden:

SET session_replication_role = replica; 

Diese Auslöser für die aktuelle Sitzung deaktiviert.

für die gleiche Sitzung wieder aktivieren:

SET session_replication_role = DEFAULT; 

Quelle: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

+1

+1 für den Quelllink! – David

+2

Ehrfürchtig. Habe meine Masselöschung von 30 Minuten auf <1 Sekunde gehen lassen. –

+4

Es ist auch praktisch, dass dieser Befehl die Constraint-Trigger nicht deaktiviert. –

6

Sie können auch Auslöser in pgAdmin deaktivieren (III):

  1. Tisch
  2. Finden Erweitern Sie die +
  3. Finden Sie Ihren Auslöser in Trigger
  4. Klicken Sie mit der rechten Maustaste, deaktivieren Sie "Auslöser aktiviert?" wenn ich eine Tabelle über Tabelleneditor in pgAdmin
5
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)

0
SET session_replication_role = replica; 

auch dosent Arbeit für mich in Postgres 9.1. Ich benutze die zwei Funktionen von Bartolo-Otrit mit einigen Änderungen beschrieben. Ich habe die erste Funktion so geändert, dass sie für mich funktioniert, weil der Namespace oder das Schema vorhanden sein muss, um die Tabelle korrekt zu identifizieren. Der neue Code ist:

CREATE OR REPLACE FUNCTION disable_triggers(a boolean, nsp character varying) 
    RETURNS void AS 
$BODY$ 
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.%I %s trigger all', nsp,r.relname, act); 
    end loop; 
end; 
$BODY$ 
    LANGUAGE plpgsql VOLATILE 
    COST 100; 
ALTER FUNCTION disable_triggers(boolean, character varying) 
    OWNER TO postgres; 

dann einfach i für jedes Schema eine Auswahlabfrage tun:

SELECT disable_triggers(true,'public'); 
SELECT disable_triggers(true,'Adempiere'); 
3

Für disable Trigger

ALTER TABLE table_name DISABLE TRIGGER trigger_name 

Für ermöglichen Trigger

ALTER TABLE table_name ENABLE TRIGGER trigger_name 
Verwandte Themen