Tôi đang tải dữ liệu hàng loạt và có thể tính lại tất cả các sửa đổi kích hoạt với giá rẻ hơn nhiều so với thực tế so với trên cơ sở từng hàng.
Làm cách nào tôi có thể tạm thời vô hiệu hóa tất cả các kích hoạt trong PostgreSQL?
Tôi đang tải dữ liệu hàng loạt và có thể tính lại tất cả các sửa đổi kích hoạt với giá rẻ hơn nhiều so với thực tế so với trên cơ sở từng hàng.
Làm cách nào tôi có thể tạm thời vô hiệu hóa tất cả các kích hoạt trong PostgreSQL?
Câu trả lời:
Ngoài ra, nếu bạn muốn tắt tất cả các kích hoạt, không chỉ các kích hoạt trên bảng USER, bạn có thể sử dụng:
SET session_replication_role = replica;
Điều này vô hiệu hóa kích hoạt cho phiên hiện tại.
Để kích hoạt lại cho cùng một phiên:
SET session_replication_role = DEFAULT;
Nguồn: http://koo.fi/blog/2013/01/08/disable-postgresql-triggers-temporantly/
ENABLE REPLICA
hoặc ENABLE ALWAYS
.
10.4
và dường như bỏ qua tuyên bố trên.
PostgreSQL biết ALTER TABLE tblname DISABLE TRIGGER USER
lệnh, dường như làm những gì tôi cần. Xem BẢNG TUYỆT VỜI .
ALTER TABLE ... DISABLE TRIGGER USER
yêu cầu một khóa độc quyền trên bàn.
Để vô hiệu hóa kích hoạt
ALTER TABLE table_name DISABLE TRIGGER trigger_name
Để kích hoạt kích hoạt
ALTER TABLE table_name ENABLE TRIGGER trigger_name
ALTER TABLE table_name DISABLE TRIGGER all
SET session_replication_role = replica;
Nó không hoạt động với PostgreQuery 9.4 trên máy Linux của tôi nếu tôi thay đổi bảng thông qua trình soạn thảo bảng trong pgAdmin và hoạt động nếu tôi thay đổi bảng thông qua truy vấn thông thường. Các thay đổi thủ công trong bảng pg_trigger cũng không hoạt động nếu không khởi động lại máy chủ mà truy vấn động như trên postgresql.nabble.com ENABLE / DISABLE ALL TRIGGERS IN DATABASE hoạt động. Nó có thể hữu ích khi bạn cần một số điều chỉnh.
Ví dụ: nếu bạn có các bảng trong một không gian tên cụ thể thì đó có thể là:
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;
Nếu bạn muốn tắt tất cả các kích hoạt với chức năng kích hoạt nhất định, đó có thể là:
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;
Tài liệu PostgreSQL cho danh mục hệ thống
Có một tùy chọn điều khiển khác của quá trình bắn kích hoạt:
ALTER TABLE ... ENABLE REPLICA TRIGGER ... - kích hoạt sẽ chỉ kích hoạt ở chế độ bản sao.
ALTER TABLE ... ENABLE LUÔN LUÔN TRIGGER ... - kích hoạt sẽ luôn luôn kích hoạt (rõ ràng)
Bạn cũng có thể tắt các kích hoạt trong pgAdmin (III):
SET session_replication_role = replica;
cũng là công việc hiệu quả đối với tôi trong Postgres 9.1. tôi sử dụng hai chức năng được mô tả bởi bartolo-otrit với một số sửa đổi. Tôi đã sửa đổi hàm đầu tiên để làm cho nó hoạt động với tôi vì không gian tên hoặc lược đồ phải có mặt để xác định bảng chính xác. Mã mới là:
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;
sau đó tôi chỉ cần thực hiện một truy vấn chọn cho mọi lược đồ:
SELECT disable_triggers(true,'public');
SELECT disable_triggers(true,'Adempiere');