回答:
または、USERテーブルのトリガーだけでなく、すべてのトリガーを無効にしたい場合は、以下を使用できます。
SET session_replication_role = replica;
これにより、現在のセッションのトリガーが無効になります。
同じセッションで再度有効にするには:
SET session_replication_role = DEFAULT;
ソース:http : //koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
ENABLE REPLICA
またはで設定されたトリガーでは機能しませんENABLE ALWAYS
。
10.4
になっており、上記のステートメントを無視しているようです。
PostgreSQLはALTER TABLE tblname DISABLE TRIGGER USER
コマンドを知っています。このコマンドは、私が必要としていることを行うようです。ALTER TABLEを参照してください。
ALTER TABLE ... DISABLE TRIGGER USER
テーブルに排他ロックが必要です。
トリガーを無効にする
ALTER TABLE table_name DISABLE TRIGGER trigger_name
トリガーを有効にする
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
LinuxマシンのPostgreSQL 9.4では、pgAdminのテーブルエディターでテーブルを変更すると機能せず、通常のクエリでテーブルを変更すると機能します。pg_triggerテーブルの手動変更もサーバーの再起動なしでは機能しませんが、postgresql.nabble.comのような動的クエリは機能しますENABLE / DISABLE ALL TRIGGERS IN DATABASEは機能します。チューニングが必要な場合に役立ちます。
たとえば、特定の名前空間にテーブルがある場合、次のようになります。
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;
特定のトリガー機能を持つすべてのトリガーを無効にする場合は、次のようになります。
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ドキュメント
トリガーの発火プロセスには別の制御オプションがあります。
ALTER TABLE ... ENABLE REPLICA TRIGGER ...-トリガーはレプリカモードでのみ起動します。
ALTER TABLE ... ENABLE ALWAYS TRIGGER ...-トリガーは常に起動します(明らかに)
SET session_replication_role = replica;
また、Postgres 9.1では、私にとって重要な作業です。bartolo-otritで説明されている2つの関数をいくつか変更して使用します。テーブルを正しく識別するには、名前空間またはスキーマが存在している必要があるため、最初の関数を変更して機能させました。新しいコードは次のとおりです。
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;
次に、すべてのスキーマに対して選択クエリを実行します:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');