2010-06-22 15 views
8

Czy istnieje sposób, aby usunąć wszystkie wyzwalacze ze wszystkich tabel w PostgreSQL? Wiem, że istnieje tabela pg_trigger, na którą mogłem spojrzeć, ale nie wygląda na to, że zawiera wystarczająco dużo informacji, aby odszyfrować wyzwalacze, które dodałem do moich tabel.Zrzuć WSZYSTKIE wyzwalacze z bazy Postgres DB?

Wygląda również na to, że ograniczenia klucza obcego pojawiają się w tabeli pg_trigger, której NIE chcę upuszczać. Chcę po prostu usunąć wyzwalacz utworzony przez użytkownika z moich tabel i zachować FK.

Wszelkie sugestie?

Odpowiedz

19

Dzięki, James.

Funkcja od Drop ALL triggers from Postgres DB? usuwa tylko wystąpienie z pierwszej tabeli i pozostawia wyzwalacze o tej samej nazwie w innych tabelach. Oto stała funkcja:

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

Dzięki za złapanie tego! – JamesD

+1

To jest drugi raz, gdy ta odpowiedź mi pomoże, chciałbym dać +1 ponownie, gdybym mógł –

+0

"information_schema" nie ma wyzwalaczy TRUNCATE, więc użyj czegoś takiego: SELECT tgname AS trigger_name, relname AS event_object_table FROM pg_trigger INNER JOIN pg_class ON pg_class .oid = tgrelid' – Lloeki

1

Spójrz w information_schema:

SELECT * FROM information_schema.triggers; 
+0

SELECT trigger_name OD information_schema.triggers; działa lepiej. – Evgeny

0

Można zacząć od tego zapytania, aby znaleźć outr nazwy wyzwalania:

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

Najłatwiej będzie pg_dump -s definicji obiektów i filtrować je na linie zaczynając od CREATE TRIGGER.

Coś

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

(w bash) powinien działać (jego przeglądu, a następnie uruchomić w bazie danych).

Zamiast tego prawdopodobnie powinieneś rozważyć alter table table_name disable trigger trigger_name.

2

AKTUALIZACJA: Zobacz prawdziwe rozwiązanie dla pełnej funkcji, którą chcesz.

Dobra, ja przyszedłem z funkcji, która robi to dla mnie:

 
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(); 

Że spadnie żadnych spust w schemacie publicznym.

2

Po prostu spuść kaskadę języka, w którym zostały utworzone wyzwalacze.
Na przykład utworzyć wyzwalacze w plpgsql, więc poniższe zapytanie usuwa wszystkie wyzwala natychmiastowo -

DROP LANGUAGE plpgsql CASCADE; 
0

wolę ten (na podstawie that) nad przyjętej odpowiedzi przez @ kuznetso3v ponieważ daje mi szansę do wglądu z DROP STATEMENT s przed wykonaniem ich kopiowania i wklejania:

SELECT 'DROP TRIGGER ' || trigger_name || ' ON ' || event_object_table || ';' 
FROM information_schema.triggers 
WHERE trigger_schema = 'public'; 
Powiązane problemy