PostgreSQL에서 트리거를 일시적으로 비활성화하려면 어떻게합니까?
나는 데이터를 대량으로로드하고 있으며 사실보다 훨씬 저렴하게 모든 트리거 수정을 다시 계산할 수 있습니다.
PostgreSQL에서 모든 트리거를 일시적으로 비활성화하려면 어떻게해야합니까?
또는 USER 테이블의 트리거뿐만 아니라 모든 트리거를 비활성화하려는 경우 다음을 사용할 수 있습니다.
SET session_replication_role = replica;
현재 세션에 대한 트리거를 비활성화합니다.
동일한 세션에서 다시 활성화하려면
SET session_replication_role = DEFAULT;
출처 : http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporarily/
PostgreSQL은 ALTER TABLE tblname DISABLE TRIGGER USER
명령을 알고 있으며 , 필요한 작업을 수행하는 것 같습니다. ALTER TABLE을 참조하십시오 .
비활성화 트리거
ALTER TABLE table_name DISABLE TRIGGER trigger_name
활성화 트리거
ALTER TABLE table_name ENABLE TRIGGER trigger_name
pgAdmin (III)에서 트리거를 비활성화 할 수도 있습니다.
- 테이블 찾기
- +를 확장하십시오
- 트리거에서 트리거 찾기
- 마우스 오른쪽 버튼을 클릭하고 "Trigger Enabled?"를 선택 취소하십시오.
SET session_replication_role = replica;
pgAdmin에서 테이블 편집기를 통해 테이블을 변경하면 Linux 컴퓨터에서 PostgreSQL 9.4와 작동하지 않으며 일반 쿼리를 통해 테이블을 변경하면 작동합니다. pg_trigger 테이블의 수동 변경 사항은 서버를 다시 시작하지 않아도 작동하지 않지만 postgresql.nabble.com 과 같은 동적 쿼리는 데이터베이스의 ENABLE / DISABLE ALL TRIGGERS 작동합니다. 튜닝이 필요할 때 유용 할 수 있습니다.
예를 들어 특정 네임 스페이스에 테이블이 있으면 다음과 같습니다.
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 ... 항상 TRIGGER 활성화 ...-트리거가 항상 발생합니다 (분명히)
SET session_replication_role = replica;
also dosent work for me in Postgres 9.1. i use the two function described by bartolo-otrit with some modification. I modified the first function to make it work for me because the namespace or the schema must be present to identify the table correctly. The new code is :
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;
then i simply do a select query for every schema :
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');
참고URL : https://stackoverflow.com/questions/3942258/how-do-i-temporarily-disable-triggers-in-postgresql
'program story' 카테고리의 다른 글
BackStack에서 조각 애니메이션을 반전시키는 방법은 무엇입니까? (0) | 2020.07.26 |
---|---|
sbt-assembly : 중복 제거 발견 오류 (0) | 2020.07.26 |
도커-컨테이너에서 자동 다시 시작을 어떻게 비활성화합니까? (0) | 2020.07.26 |
LINQ에서 날짜가 가장 높은 레코드 만 선택하는 방법 (0) | 2020.07.26 |
MySQL에 데이터를 JSON으로 저장 (0) | 2020.07.26 |