Ich lade Daten in großen Mengen und kann alle Trigger-Änderungen im Nachhinein viel billiger als zeilenweise neu berechnen.
Wie kann ich alle Trigger in PostgreSQL vorübergehend deaktivieren?
Ich lade Daten in großen Mengen und kann alle Trigger-Änderungen im Nachhinein viel billiger als zeilenweise neu berechnen.
Wie kann ich alle Trigger in PostgreSQL vorübergehend deaktivieren?
Antworten:
Wenn Sie alternativ alle Trigger deaktivieren möchten, nicht nur die in der USER-Tabelle, 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-temporARY/
ENABLE REPLICA
oder festgelegt wurden ENABLE ALWAYS
.
10.4
und es scheint diese obige Aussage zu ignorieren.
PostgreSQL kennt den ALTER TABLE tblname DISABLE TRIGGER USER
Befehl, der zu tun scheint, was ich brauche. Siehe ALTER TABLE .
ALTER TABLE ... DISABLE TRIGGER USER
Erfordert eine exklusive Sperre für den Tisch.
Zum Deaktivieren des Auslösers
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Zum Aktivieren des Triggers
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
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 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 auf postgresql.nabble.com ENABLE / DISABLE ALL TRIGGERS IN DATABASE funktionieren. Dies kann nützlich sein, wenn Sie eine Abstimmung 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 Trigger-Zündvorgang:
ALTER TABLE ... REPLICA TRIGGER AKTIVIEREN ... - Der Trigger wird nur im Replikationsmodus ausgelöst.
ALTER TABLE ... IMMER TRIGGER AKTIVIEREN ... - Trigger wird immer (offensichtlich) ausgelöst
Sie können Trigger auch in pgAdmin (III) deaktivieren:
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 so geändert, dass 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');