2010-10-15 22 views

Odpowiedz

81

PostgreSQL zna polecenie ALTER TABLE tblname DISABLE TRIGGER USER, które wydaje się robić to, czego potrzebuję. Zobacz ALTER TABLE.

+0

Dokładnie to, co szukałem za, dzięki! –

+0

A następnie, w jaki sposób "ponownie obliczyć wszystkie modyfikacje wyzwalacza"? –

+9

Ostrożnie z jednoczesnym ładowaniem: 'ALTER TABLE ... DISABLE TRIGGER USER' wymaga wyłącznego blokowania na stole. –

92

Alternatywnie, jeśli chce, aby wyłączyć wszystkie wyzwalacze, nie tylko tych w tabeli użytkownika, można użyć:

SET session_replication_role = replica; 

Wyłącza wyzwalaczy dla bieżącej sesji.

Aby ponownie włączyć do tej samej sesji:

SET session_replication_role = DEFAULT; 

Źródło: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

+1

+1 dla linku źródłowego! – David

+2

Awesome. Zrobiłem masowe usuwanie z 30 minut do <1 sekundy :) –

+4

Przydaje się również, że to polecenie nie wyłącza wyzwalaczy więzów –

6

Można również wyłączyć wyzwalaczy w pgAdmin (III):

  1. Znajdź stół
  2. Rozszerz +
  3. Znajdź swój spust w wyzwalaczach
  4. Kliknij prawym przyciskiem myszy, odznacz "Trigger Enabled?"
5
SET session_replication_role = replica; 

To nie działa z PostgreSQL 9.4 na moim komputerze z systemem Linux, jeśli zmienię stolik poprzez edytor tabel w pgAdmin i działa w przypadku zmiany przez zwykłą tabelę zapytania. Ręczne zmiany w tabeli pg_trigger również nie działają bez restartu serwera, ale działa dynamiczne zapytanie, takie jak na postgresql.nabble.com ENABLE/DISABLE ALL TRIGGERS IN DATABASE. Może to być przydatne, gdy potrzebujesz strojenia.

Na przykład, jeśli masz tabel w danej przestrzeni nazw może to być:

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; 

Jeśli chcesz wyłączyć wszystkie wyzwala z pewną funkcją wyzwalania może być: dokumentacja

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; 

PostgreSQL dla system catalogs


Istnieją inne kontr ol opcje procesu wyzwalania wyzwalacza:

ALTER TABELA ... WŁĄCZ REPLICA TRIGGER ... - trigger uruchamia się tylko w trybie repliki.

ALTER TABLE ... włączyć ZAWSZE spust ... - wyzwalacz będzie ogień zawsze (oczywiście)

0
SET session_replication_role = replica; 

także doza pracę dla mnie w PostgreSQL 9.1. Używam dwóch funkcji opisanych przez bartolo-otrit z pewnymi modyfikacjami. Zmodyfikowałem pierwszą funkcję, aby działała we mnie, ponieważ przestrzeń nazw lub schemat musi być obecny, aby poprawnie zidentyfikować tabelę. Nowy kod jest:

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; 

następnie po prostu zrobić kwerendę wybierającą dla każdego schematu:

SELECT disable_triggers(true,'public'); 
SELECT disable_triggers(true,'Adempiere'); 
3

Aby wyłączyć wyzwalacz

ALTER TABLE table_name DISABLE TRIGGER trigger_name 

Dla umożliwienia wyzwalania

ALTER TABLE table_name ENABLE TRIGGER trigger_name 
Powiązane problemy