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
SET session_replication_role = replica;
Postgre와 함께 작동하지 않습니다.pgAdmin에서 테이블 편집기를 통해 테이블을 변경하고 일반 쿼리를 통해 테이블을 변경하면 작동하는 경우 Linux 시스템에서 SQL 9.4.pg_trigger 테이블의 수동 변경도 서버 재시작 없이는 작동하지 않지만 postgresql.nabble.com 의 ENABLE/DISABLE ALL TRIGRS IN DATABATE와 같은 동적 쿼리가 작동합니다.튜닝이 필요할 때 유용할 수 있습니다.
예를 들어, 특정 네임스페이스에 테이블이 있는 경우 다음과 같습니다.
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;
트리거 실행 프로세스에는 다음과 같은 다른 제어 옵션이 있습니다.
다른 테이블...복제 트리거 사용... - 복제 모드에서만 트리거가 실행됩니다.
다른 테이블...항상 트리거 활성화... - 트리거는 항상(분명히) 실행됩니다.
pgAdmin(III)에서 트리거를 비활성화할 수도 있습니다.
- 테이블 찾기
- +를 확장합니다.
- 트리거에서 트리거 찾기
- 마우스 오른쪽 단추를 클릭하고 "트리거 활성화?"를 선택 취소합니다.
SET session_replication_role = replica;
또한 Postgres 9.1에서 나를 위해 작업을 보냈습니다. 나는 약간의 수정과 함께 bartolo-otrit에 의해 설명된 두 가지 기능을 사용합니다.테이블을 올바르게 식별하려면 네임스페이스나 스키마가 있어야 하기 때문에 첫 번째 함수를 나에게 맞게 수정했습니다.새 코드는 다음과 같습니다.
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');
데이터베이스 작성을 처리하고 해당 역할에 대한 복제를 설정하는 역할을 작성하는 것이 이 작업을 수행하는 방법은 다음과 같습니다.
ALTER ROLE role_name SET session_replication_role = 'replica';
이렇게 하면 데이터를 채우는 데 해당 역할을 사용할 수 있으며 트리거 등을 비활성화하거나 다시 활성화할 염려가 없습니다.
언급URL : https://stackoverflow.com/questions/3942258/how-do-i-temporarily-disable-triggers-in-postgresql
'programing' 카테고리의 다른 글
.NET 어셈블리에 대한 CLS 준수 설정 (0) | 2023.05.29 |
---|---|
"파일 끝에 새 줄 없음" 로그의 의미는 무엇입니까? (0) | 2023.05.29 |
저는 두 개의 수업을 "싸울" 수 있는 프로그램을 만들었습니다.어떤 이유에서든 C#이 항상 승리합니다.VB.NET에 무슨 문제가 있나요? (0) | 2023.05.29 |
MongoDB 노드는 결과를 처리하지 않는 방법을 찾으십니까? (0) | 2023.05.29 |
VB의 새 줄 문자입니다.그물? (0) | 2023.05.29 |