with trigger firstrow fieldterminator ejemplos postgresql triggers bulkinsert

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):

  1. Encuentra tu mesa
  2. Expandir +
  3. Encuentra tu disparador en Triggers
  4. 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'');