2010-10-15 5 views

risposta

81

PostgreSQL conosce il comando ALTER TABLE tblname DISABLE TRIGGER USER, che sembra fare ciò di cui ho bisogno. Vedi ALTER TABLE.

+0

Esattamente quello che stavo cercando grazie, grazie! –

+0

E come si "ricalcola tutte le modifiche trigger"? –

+9

Attenzione al carico simultaneo: 'ALTER TABLE ... DISABLE TRIGGER USER' richiede un blocco esclusivo sul tavolo. –

92

In alternativa, se si vogliono disabilitare tutti i trigger, non solo quelli sul tavolo utente, è possibile utilizzare:

SET session_replication_role = replica; 

Disabilita trigger per la sessione corrente.

Per riattivare per la stessa sessione:

SET session_replication_role = DEFAULT; 

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

+1

+1 per il link sorgente! – David

+2

Fantastico. Effettuata la cancellazione di massa da 30 minuti a <1 secondo :) –

+4

È anche utile che questo comando non disabiliti i trigger di vincoli –

6

È inoltre possibile disabilitare i trigger in pgAdmin (III):

  1. Trova il tuo tavolo
  2. Espandi il +
  3. Trova il trigger in Trigger
  4. Fare clic con il pulsante destro del mouse, deselezionare "Trigger attivato?"
5
SET session_replication_role = replica; 

Non funziona con PostgreSQL 9.4 sulla mia macchina Linux se cambio un tavolo tramite editor di tabella in pgAdmin e funziona se cambio tabella tramite interrogazione 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 ENABLE/DISABLE ALL TRIGGERS IN DATABASE funziona. Potrebbe essere utile quando hai bisogno di una messa a punto.

Per esempio, se si dispone di tavoli in un particolare 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 disattivare tutti i trigger con una certa funzione di trigger potrebbe essere: documentazione

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 per system catalogs


Ci sono altri contr ol opzioni del processo di innesco del grilletto:

ALTER TABLE ... ENABLE REPLICA TRIGGER ... - il trigger si attiva solo in modalità replica.

ALTER TABLE ... SEMPRE ATTIVA TRIGGER ... - grilletto scatterà sempre (ovviamente)

0
SET session_replication_role = replica; 

lavoro anche dosent per me in Postgres 9.1. io uso le due funzioni descritte da bartolo-otrit con alcune modifiche. Ho modificato la prima funzione per farla 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; 

poi ho semplicemente fare una query di selezione per ogni schema:

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

per disabili grilletto

ALTER TABLE table_name DISABLE TRIGGER trigger_name 

Per consentire grilletto

ALTER TABLE table_name ENABLE TRIGGER trigger_name