web-dev-qa-db-ja.com

PostgreSQLでトリガーを一時的に無効にするにはどうすればよいですか?

私はデータを一括読み込みし、すべてのトリガーの変更を、行ごとではなく、事後のほうがはるかに安価に再計算できます。

PostgreSQLのすべてのトリガーを一時的に無効にするにはどうすればよいですか?

110
David Schmitt

PostgreSQLはALTER TABLE tblname DISABLE TRIGGER USERコマンドを知っていますが、これは必要なことを行うようです。 ALTER TABLE を参照してください。

109
David Schmitt

または、USERテーブルのトリガーだけでなく、すべてのトリガーを無効にする場合は、次を使用できます。

SET session_replication_role = replica;

これにより、現在のセッションのトリガーが無効になります。

同じセッションで再度有効にするには:

SET session_replication_role = DEFAULT;

ソース: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/

136
zyzof

無効化トリガー

ALTER TABLE table_name DISABLE TRIGGER trigger_name

トリガーを有効にする

ALTER TABLE table_name ENABLE TRIGGER trigger_name
27
Mise

PgAdmin(III)でトリガーを無効にすることもできます。

  1. テーブルを見つける
  2. +を展開します
  3. トリガーでトリガーを見つける
  4. 右クリックして、「トリガーを有効にしますか?」のチェックを外します。
6
Neil McGuigan
SET session_replication_role = replica; 

PgAdminのテーブルエディターでテーブルを変更すると、LinuxマシンのPostgreSQL 9.4では動作せず、通常のクエリでテーブルを変更すると動作します。 pg_triggerテーブルの手動変更もサーバーの再起動なしでは機能しませんが、 postgresql.nabble.comデータベース内のすべてのトリガーの有効化/無効化 のような動的クエリは機能します。チューニングが必要な場合に役立ちます。

たとえば、特定の名前空間にテーブルがある場合、次のようになります。

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 ...-トリガーは常に起動します(明らかに)

5
bartolo-otrit
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');
3
Samih Chouhen