2010-06-22 10 views
8

¿Hay alguna manera de soltar TODOS los disparadores de TODAS las tablas en Postgres? Sé que hay una tabla pg_trigger que podría ver, pero no parece que contenga suficiente información para descifrar qué desencadenantes he agregado a mis tablas.¿Desea soltar TODOS los desencadenadores de Postgres DB?

También parece que las restricciones de clave externa aparecen en la tabla pg_trigger, que NO deseo soltar. Solo quiero eliminar el activador creado por el usuario de mis tablas y mantener las FK.

¿Alguna sugerencia?

Respuesta

19

Gracias, James.

La función de Drop ALL triggers from Postgres DB? elimina solo la aparición de la primera tabla y deja los desencadenantes con el mismo nombre en otras tablas. Aquí está la función fija:

CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE 
    triggNameRecord RECORD; 
    triggTableRecord RECORD; 
BEGIN 
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP 
     FOR triggTableRecord IN SELECT distinct(event_object_table) from information_schema.triggers where trigger_name = triggNameRecord.trigger_name LOOP 
      RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table; 
      EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';'; 
     END LOOP; 
    END LOOP; 

    RETURN 'done'; 
END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

select strip_all_triggers(); 
+0

¡Gracias por coger eso! – JamesD

+1

Esta es la segunda vez que esta respuesta me ayudaría, me gustaría +1 nuevamente si pudiera –

+0

'information_schema' faltan los desencadenadores TRUNCATE, así que use algo como esto:' SELECCIONE tgname AS nombre_desencadenante, relname AS event_object_table FROM pg_trigger INNER JOIN pg_class ON pg_class .oid = tgrelid' – Lloeki

1

Tome una mirada en el INFORMATION_SCHEMA:

SELECT * FROM information_schema.triggers; 
+0

trigger_name SELECT information_schema.triggers; funciona mejor – Evgeny

0

usted podría comenzar a partir de esta consulta, para encontrar outr nombres de disparo:

select * from pg_trigger t,pg_proc where 
pg_proc.oid=t.tgfoid 
1

más fácil será pg_dump -s definiciones de objetos y filtrarla para las líneas comenzando con CREATE TRIGGER.

Algo así como

./pg_dump -s db_name | grep '^CREATE TRIGGER' | \ 
    while read _ _ triggername _; do \ 
    echo drop trigger "$triggername;"; \ 
    done 

(en bash) debería funcionar (revisarlo y luego ejecutar la base de datos).

Pero quizás deberías considerar alter table table_name disable trigger trigger_name en su lugar.

2

ACTUALIZACIÓN: Consulte la solución real para la función completa que desee.

Muy bien, se le ocurrió una función que hace esto por mí:

 
CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE 
     triggNameRecord RECORD; 
    triggTableRecord RECORD; 
BEGIN 
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP 
     SELECT distinct(event_object_table) INTO triggTableRecord from information_schema.triggers where trigger_name = triggNameRecord.trigger_name; 
     RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table; 
     EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';'; 
    END LOOP; 

    RETURN 'done'; 
END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

select strip_all_triggers(); 

que eliminarán cualquier activación en el esquema público.

2

Simplemente coloque en cascada el idioma en el que creó los activadores.
Por ejemplo, puedo crear desencadenantes en plpgsql, por lo que la consulta siguiente elimina todos los disparadores de forma instantánea -

DROP LANGUAGE plpgsql CASCADE; 
0

prefiero esto (basado en that) sobre la respuesta aceptada por @ kuznetso3v porque me da la oportunidad de inspeccionar los DROP STATEMENT s antes de ejecutarlas con copiar y pegar:

SELECT 'DROP TRIGGER ' || trigger_name || ' ON ' || event_object_table || ';' 
FROM information_schema.triggers 
WHERE trigger_schema = 'public'; 
Cuestiones relacionadas