2010-10-15 33 views

Trả lời

81

PostgreSQL biết lệnh ALTER TABLE tblname DISABLE TRIGGER USER, điều này dường như làm những gì tôi cần. Xem ALTER TABLE.

+0

Chính xác những gì tôi đang tìm kiếm cho, cảm ơn! –

+0

Và sau đó làm thế nào để bạn "tính toán lại tất cả các thay đổi kích hoạt"? –

+9

Cẩn thận với tải đồng thời: 'ALTER TABLE ... DISABLE TRIGGER USER' yêu cầu khóa độc quyền trên bàn. –

92

Ngoài ra, nếu bạn đang muốn vô hiệu hóa tất cả gây nên, không chỉ những người trên bàn USER, bạn có thể sử dụng:

SET session_replication_role = replica; 

này vô hiệu hóa trigger 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-temporarily/

+1

+1 cho liên kết nguồn! – David

+2

Tuyệt vời. Việc xóa hàng loạt của tôi là từ 30 phút đến <1 giây :) –

+4

Nó cũng tiện dụng khi lệnh này không vô hiệu hóa các ràng buộc ràng buộc –

6

Bạn cũng có thể vô hiệu hóa trigger trong pgAdmin (III):

  1. Tìm bảng
  2. Mở rộng +
  3. Tìm trình kích hoạt của bạn trong Trình kích hoạt
  4. Nhấp chuột phải, bỏ chọn "Kích hoạt đã bật?"
5
SET session_replication_role = replica; 

Nó không làm việc với PostgreSQL 9.4 trên máy tính Linux của tôi nếu tôi thay đổi một 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. Thay đổi thủ công trong bảng pg_trigger cũng không hoạt động mà không cần khởi động lại máy chủ nhưng 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ó bảng trong một không gian tên đặc biệt nó 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 vô hiệu hóa tất cả gây nên với chức năng kích hoạt nhất định nó có thể là: tài liệu

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 cho system catalogs


Có một contr khác tùy chọn ol của quá trình kích hoạt kích hoạt:

ALTER TABLE ... ENABLE REPLICA TRIGGER ... - trình kích hoạt sẽ chỉ kích hoạt ở chế độ bản sao.

ALTER TABLE ... ENABLE luôn kích hoạt ... - kích hoạt sẽ cháy luôn (rõ ràng)

0
SET session_replication_role = replica; 

làm việc cũng dosent cho 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 đối với tôi vì không gian tên hoặc giản đồ phải có mặt để xác định bảng một cách 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 làm một truy vấn chọn cho mỗi schema:

SELECT disable_triggers(true,'public'); 
SELECT disable_triggers(true,'Adempiere'); 
3

Đối disable trigger

ALTER TABLE table_name DISABLE TRIGGER trigger_name 

Đối với cho phép kích hoạt

ALTER TABLE table_name ENABLE TRIGGER trigger_name 
Các vấn đề liên quan