it-swarm.com.de

Wie deaktiviere ich Trigger in PostgreSQL vorübergehend?

Ich lade Daten in großen Mengen und kann alle Trigger-Modifikationen viel billiger nachträglich neu berechnen als zeilenweise.

Wie kann ich alle Trigger in PostgreSQL vorübergehend deaktivieren?

110
David Schmitt

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

109
David Schmitt

Wenn Sie alternativ alle Trigger deaktivieren möchten, nicht nur die in der Tabelle USER, können Sie Folgendes verwenden:

SET session_replication_role = replica;

Dadurch werden Trigger für die aktuelle Sitzung deaktiviert.

So aktivieren Sie dieselbe Sitzung erneut:

SET session_replication_role = DEFAULT;

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

136
zyzof

Zum Deaktivieren des Triggers

ALTER TABLE table_name DISABLE TRIGGER trigger_name

Zum Aktivieren des Triggers

ALTER TABLE table_name ENABLE TRIGGER trigger_name
27
Mise

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

  1. Finde deinen Tisch
  2. Erweitern Sie das +
  3. Finden Sie Ihren Auslöser in Auslöser
  4. Klicken Sie mit der rechten Maustaste und deaktivieren Sie "Auslöser aktiviert?"
6
Neil McGuigan
SET session_replication_role = replica; 

Es funktioniert nicht mit PostgreSQL 9.4 auf meinem Linux-Computer, wenn ich eine Tabelle über den Tabelleneditor in pgAdmin ändere, und es funktioniert, wenn ich die Tabelle über eine normale Abfrage ändere. Manuelle Änderungen in der Tabelle pg_trigger funktionieren auch nicht ohne Neustart des Servers, aber dynamische Abfragen wie am postgresql.nabble.com AKTIVIEREN/DEAKTIVIEREN ALLER TRIGGER IN DER DATENBANK funktionieren. Dies kann hilfreich sein, wenn Sie eine Optimierung benötigen.

Wenn Sie beispielsweise Tabellen in einem bestimmten Namespace haben, kann dies 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 einer bestimmten Triggerfunktion deaktivieren möchten, kann dies 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 für Systemkataloge


Es gibt weitere Steuerungsoptionen für den Auslösevorgang:

ALTER TABLE ... REPLICA TRIGGER AKTIVIEREN ... - Der Trigger wird nur im Replikationsmodus ausgelöst.

ALTER TABLE ... ENABLE IMMER TRIGGER ... - Trigger wird immer (offensichtlich) ausgelöst

5
bartolo-otrit
SET session_replication_role = replica;  

auch dosent arbeit für mich in postgres 9.1. ich benutze die beiden von bartolo-otrit beschriebenen funktionen mit einigen modifikationen. Ich habe die erste Funktion geändert, damit sie für mich funktioniert, da der Namespace oder das Schema vorhanden sein müssen, um die Tabelle korrekt zu identifizieren. Der neue Code lautet:

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 mache ich einfach eine Auswahlabfrage für jedes Schema:

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