2010-10-15 16 views

Respuesta

81

PostgreSQL conoce el comando ALTER TABLE tblname DISABLE TRIGGER USER, que parece hacer lo que necesito. Ver ALTER TABLE.

+0

Exactamente lo que estaba buscando para, gracias! –

+0

Y luego, ¿cómo "recalcula todas las modificaciones de activación"? –

+9

Cuidado con la carga simultánea: 'ALTER TABLE ... DISABLE TRIGGER USER' requiere un bloqueo exclusivo en la tabla. –

92

Alternativamente, si quieren desactivar todos los disparadores, no sólo los de la tabla de usuario, puede utilizar:

SET session_replication_role = replica; 

Esto desactiva los disparadores para la sesión actual.

Para volver a habilitar para la misma sesión:

SET session_replication_role = DEFAULT; 

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

+1

+1 para el enlace de origen! – David

+2

Impresionante. Hice que mi eliminación masiva pasara de 30 minutos a <1 segundo :) –

+4

También es útil que este comando no deshabilite los activadores de restricción –

6

También puede desactivar los disparadores en pgAdmin (III):

  1. Encuentra su mesa
  2. Expanda +
  3. Busque su activador en Triggers
  4. Haga clic con el botón derecho, desmarque "¿Disparador habilitado?"
5
SET session_replication_role = replica; 

No funciona con PostgreSQL 9.4 en mi máquina Linux si cambio de una tabla a través del editor de tablas en pgAdmin y funciona si cambio de mesa a través de consulta ordinaria. Los cambios manuales en la tabla pg_trigger tampoco funcionan sin el reinicio del servidor, pero funciona la consulta dinámica como en postgresql.nabble.com ENABLE/DISABLE ALL TRIGGERS IN DATABASE. Podría ser útil cuando necesites un ajuste.

Por ejemplo, si tiene tablas en un espacio de nombres particular, podría ser:

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; 

Si desea desactivar todos los disparadores con cierta función de activación podría ser: documentación

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


Hay otro contr ol opciones del proceso de cocción de activación:

ALTER TABLE ... ENABLE REPLICA TRIGGER ... - el disparador se disparará solo en el modo de réplica.

ALTER TABLE ... ACTIVAR Activar siempre ... - gatillo siempre se dispara (obviamente)

0
SET session_replication_role = replica; 

dosent trabajo también para mí en Postgres 9.1. uso las dos funciones descritas por bartolo-otrit con algunas modificaciones. Modifiqué la primera función para que me funcionara porque el espacio de nombres o el esquema deben estar presentes para identificar la tabla correctamente. El nuevo código es:

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; 

entonces yo simplemente hacer una consulta de selección para cada esquema:

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

Para desactivar el gatillo

ALTER TABLE table_name DISABLE TRIGGER trigger_name 

Para activar el gatillo

ALTER TABLE table_name ENABLE TRIGGER trigger_name 
Cuestiones relacionadas