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 REPLICAo ENABLE ALWAYS.
10.4e sembra ignorare questa affermazione di cui sopra.
PostgreSQL conosce il ALTER TABLE tblname DISABLE TRIGGER USERcomando, che sembra fare ciò di cui ho bisogno. Vedi ALTER TABLE .
ALTER TABLE ... DISABLE TRIGGER USERrichiede 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');