Ł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?
Ł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?
Odpowiedzi:
Alternatywnie, jeśli chcesz wyłączyć wszystkie wyzwalacze, a nie tylko te z tabeli USER, możesz użyć:
SET session_replication_role = replica;
Spowoduje to wyłączenie wyzwalaczy dla bieżącej sesji.
Aby ponownie włączyć dla tej samej sesji:
SET session_replication_role = DEFAULT;
Źródło: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporary/
ENABLE REPLICA
lub ENABLE 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 .
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
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
Możesz także wyłączyć wyzwalacze w pgAdmin (III):
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');