firstrow - postgresql trigger with parameters
¿Cómo desactivo los desencadenadores en PostgreSQL? (6)
Alternativamente, si desea deshabilitar todos los desencadenadores, no solo aquellos en la tabla USER, puede usar:
SET session_replication_role = replica;
Esto deshabilita los desencadenadores 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/
Estoy cargando datos a granel y puedo volver a calcular todas las modificaciones de activación mucho más baratas después del hecho que en una fila por fila.
¿Cómo puedo desactivar temporalmente todos los desencadenadores en PostgreSQL?
Para desactivar el gatillo
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Para habilitar desencadenar
ALTER TABLE table_name ENABLE TRIGGER trigger_name
PostgreSQL conoce el ALTER TABLE tblname DISABLE TRIGGER USER
, que parece hacer lo que necesito. Vea ALTERAR TABLA .
También puede desactivar activadores en pgAdmin (III):
- Encuentra tu mesa
- Expandir +
- Encuentra tu disparador en Triggers
- Haga clic con el botón derecho, desmarque "¿Disparador habilitado?"
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 ACTIVAR / DESACTIVAR TODOS LOS ACTIVADORES EN LA BASE DE DATOS funciona. Podría ser útil cuando necesites un ajuste.
Por ejemplo, si tiene tablas en un espacio de nombre 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 activación, 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 activación del disparador:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - el disparador disparará en modo de réplica solamente.
ALTER TABLE ... ENABLE SIEMPRE DISPONIBLE ... - el disparador disparará siempre (obviamente)
SET session_replication_role = replica;
también dosent trabajo para mí en Postgres 9.1. utilizo 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 simplemente hago una consulta de selección para cada esquema:
SELECT disable_triggers(true,''public'');
SELECT disable_triggers(true,''Adempiere'');