Estoy cargando datos de forma masiva y puedo volver a calcular todas las modificaciones de activación de forma mucho más económica después del hecho que fila por fila.
¿Cómo puedo desactivar temporalmente todos los desencadenantes en PostgreSQL?
Estoy cargando datos de forma masiva y puedo volver a calcular todas las modificaciones de activación de forma mucho más económica después del hecho que fila por fila.
¿Cómo puedo desactivar temporalmente todos los desencadenantes en PostgreSQL?
Respuestas:
Alternativamente, si desea deshabilitar todos los desencadenantes, no solo los de la tabla USER, puede usar:
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-tempomporary/
ENABLE REPLICA
o ENABLE ALWAYS
.
10.4
y parece ignorar esta declaración anterior.
PostgreSQL conoce el ALTER TABLE tblname DISABLE TRIGGER USER
comando, que parece hacer lo que necesito. Ver ALTER TABLE .
ALTER TABLE ... DISABLE TRIGGER USER
requiere un bloqueo exclusivo en la mesa.
Para desactivar el disparador
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Para habilitar el disparador
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
No funciona con PostgreSQL 9.4 en mi máquina Linux si cambio una tabla a través del editor de tablas en pgAdmin y funciona si cambio la tabla a través de una consulta ordinaria. Los cambios manuales en la tabla pg_trigger tampoco funcionan sin el reinicio del servidor, pero la consulta dinámica como en postgresql.nabble.com ACTIVA / DESACTIVA TODOS LOS DISPARADORES EN LA BASE DE DATOS funciona. Podría ser útil cuando necesita algo de ajuste.
Por ejemplo, si tiene tablas en un espacio de nombres en 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 deshabilitar todos los disparadores con cierta función de disparo, podría ser:
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;
Documentación de PostgreSQL para catálogos de sistemas
Hay otras opciones de control del proceso de disparo del disparador:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - el disparador se disparará solo en modo réplica.
ALTER TABLE ... HABILITAR SIEMPRE GATILLO ... - el gatillo se disparará siempre (obviamente)
También puede deshabilitar los desencadenantes en pgAdmin (III):
SET session_replication_role = replica;
También no me funciona en Postgres 9.1. Yo uso las dos funciones descritas por Bartolo-otrit con alguna modificación. Modifiqué la primera función para que funcione para mí 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 simplemente hago una consulta de selección para cada esquema:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');