I made two improvements of the solution from the older answers:
- added filtering by trigger name, table and schema
- properly handling "truncate" triggers (ignored by the original solution)
CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE
triggRecord RECORD;
BEGIN
create temp table all_triggers on commit drop as (
SELECT tgname AS trigger_name, n.nspname as trigger_schema, relname as trigger_table
FROM pg_trigger
JOIN pg_class ON pg_class.oid = tgrelid
JOIN pg_namespace n ON n.oid = pg_class.relnamespace);
FOR triggRecord IN select distinct on (trigger_schema, trigger_table, trigger_name) trigger_schema, trigger_table, trigger_name from all_triggers
where trigger_schema like 'public' and trigger_name like '%' -- MY FILTER
LOOP
RAISE NOTICE 'Dropping trigger: % on table: %.%', triggRecord.trigger_name, triggRecord.trigger_schema, triggRecord.trigger_table;
EXECUTE 'DROP TRIGGER ' || triggRecord.trigger_name || ' ON ' || triggRecord.trigger_schema || '.' || triggRecord.trigger_table || ';';
END LOOP;
RETURN 'done';
END
$$ LANGUAGE plpgsql SECURITY DEFINER;
select strip_all_triggers();