Sto caricando i dati in blocco e posso ricalcolare tutte le modifiche del trigger molto più a buon mercato dopo il fatto che su base riga per riga.
Come posso disabilitare temporaneamente tutti i trigger in PostgreSQL?
Sto caricando i dati in blocco e posso ricalcolare tutte le modifiche del trigger molto più a buon mercato dopo il fatto che su base riga per riga.
Come posso disabilitare temporaneamente tutti i trigger in PostgreSQL?
Risposte:
In alternativa, se si desidera disabilitare tutti i trigger, non solo quelli nella tabella USER, è possibile utilizzare:
SET session_replication_role = replica;
Ciò disabilita i trigger per la sessione corrente.
Per riattivare la stessa sessione:
SET session_replication_role = DEFAULT;
Fonte: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
ENABLE REPLICA
o ENABLE ALWAYS
.
10.4
e sembra ignorare questa affermazione di cui sopra.
PostgreSQL conosce il ALTER TABLE tblname DISABLE TRIGGER USER
comando, che sembra fare ciò di cui ho bisogno. Vedi ALTER TABLE .
ALTER TABLE ... DISABLE TRIGGER USER
richiede un blocco esclusivo sul tavolo.
Per disabilitare il trigger
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Per abilitare il trigger
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
Non funziona con PostgreSQL 9.4 sul mio computer Linux se cambio una tabella tramite l'editor di tabelle in pgAdmin e funziona se cambio tabella tramite query ordinaria. Anche le modifiche manuali nella tabella pg_trigger non funzionano senza il riavvio del server, ma la query dinamica come su postgresql.nabble.com ABILITA / DISATTIVA TUTTI I TRIGGER IN DATABASE funziona. Potrebbe essere utile quando hai bisogno di qualche sintonizzazione.
Ad esempio, se hai tabelle in un determinato spazio dei nomi, potrebbe essere:
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;
Se si desidera disabilitare tutti i trigger con una determinata funzione di trigger, potrebbe essere:
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;
Documentazione PostgreSQL per cataloghi di sistema
Esistono altre opzioni di controllo del processo di attivazione del trigger:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - il trigger si attiverà solo in modalità replica.
ALTER TABLE ... ABILITARE SEMPRE IL GRILLETTO ... - il grilletto sparerà sempre (ovviamente)
Puoi anche disabilitare i trigger in pgAdmin (III):
SET session_replication_role = replica;
anche il lavoro con i dosaggi per me in Postgres 9.1. io uso le due funzioni descritte da bartolo-otrit con qualche modifica. Ho modificato la prima funzione per farlo funzionare perché lo spazio dei nomi o lo schema devono essere presenti per identificare correttamente la tabella. Il nuovo codice è:
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;
quindi faccio semplicemente una query di selezione per ogni schema:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');