Ładuję dane zbiorczo i mogę ponownie obliczyć wszystkie modyfikacje wyzwalacza znacznie taniej po fakcie niż na podstawie wiersza po wierszu.
Jak mogę tymczasowo wyłączyć wszystkie wyzwalacze w PostgreSQL?
postgresql
triggers
bulkinsert
David Schmitt
źródło
źródło
ENABLE REPLICA
lubENABLE ALWAYS
.10.4
i wydaje się, że ignoruję powyższe stwierdzenie.PostgreSQL zna
ALTER TABLE tblname DISABLE TRIGGER USER
polecenie, które wydaje się robić to, czego potrzebuję. Zobacz ALTER TABLE .źródło
ALTER TABLE ... DISABLE TRIGGER USER
wymaga wyłącznej blokady na stole.Aby wyłączyć wyzwalacz
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Włącz wyzwalacz
ALTER TABLE table_name ENABLE TRIGGER trigger_name
źródło
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
Nie działa z PostgreSQL 9.4 na moim komputerze z Linuksem, jeśli zmienię tabelę za pomocą edytora tabel w pgAdmin i działa, jeśli zmienię tabelę za pomocą zwykłego 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 trochę strojenia.
Na przykład, jeśli masz tabele w określonej 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 wyzwalacze z określoną funkcją wyzwalacza, może to być:
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;
Dokumentacja PostgreSQL dla katalogów systemowych
Istnieją inne opcje sterowania procesem wyzwalania spustu:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - wyzwalacz będzie strzelał tylko w trybie repliki.
ALTER TABELA ... WŁĄCZ ZAWSZE TRIGGER ... - spust będzie zawsze (oczywiście) odpalany
źródło
Możesz także wyłączyć wyzwalacze w pgAdmin (III):
źródło
SET session_replication_role = replica;
również nie pracowałem dla mnie w Postgres 9.1. używam dwóch funkcji opisanych przez Bartolo-otrita z pewnymi modyfikacjami. Zmodyfikowałem pierwszą funkcję, aby działała dla mnie, ponieważ przestrzeń nazw lub schemat muszą być obecne, aby poprawnie zidentyfikować tabelę. Nowy kod to:
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 wykonuję zapytanie wybierające dla każdego schematu:
SELECT disable_triggers(true,'public'); SELECT disable_triggers(true,'Adempiere');
źródło