2010-06-22 34 views
8

Có cách nào để thả TẤT CẢ các trình kích hoạt khỏi TẤT CẢ các bảng trong Postgres không? Tôi biết có một bảng pg_trigger mà tôi có thể xem, nhưng có vẻ như nó không chứa đủ thông tin để tôi giải mã những tác nhân mà tôi đã thêm vào các bảng của mình.Thả TẤT CẢ các trình kích hoạt từ Postgres DB?

Dường như ràng buộc khóa ngoài hiển thị trong bảng pg_trigger, mà tôi KHÔNG muốn bỏ. Tôi chỉ muốn bỏ kích hoạt do người dùng tạo ra từ các bảng của tôi và giữ các FK.

Mọi đề xuất?

Trả lời

19

Cảm ơn, James.

Chức năng từ Drop ALL triggers from Postgres DB? chỉ loại bỏ sự xuất hiện từ bảng đầu tiên và để lại trình kích hoạt có cùng tên trong các bảng khác. Đây là chức năng cố định:

CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE 
    triggNameRecord RECORD; 
    triggTableRecord RECORD; 
BEGIN 
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP 
     FOR triggTableRecord IN SELECT distinct(event_object_table) from information_schema.triggers where trigger_name = triggNameRecord.trigger_name LOOP 
      RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table; 
      EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';'; 
     END LOOP; 
    END LOOP; 

    RETURN 'done'; 
END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

select strip_all_triggers(); 
+0

Cảm ơn bạn đã đánh bắt! – JamesD

+1

Đây là lần thứ hai câu trả lời này giúp tôi, tôi sẽ +1 một lần nữa nếu tôi có thể –

+0

'information_schema' thiếu trình kích hoạt TRUNCATE, vì vậy hãy sử dụng một cái gì đó như sau:' SELECT tgname AS trigger_name, relname AS event_object_table FROM pg_trigger INNER JOIN pg_class ON pg_class .oid = tgrelid' – Lloeki

1

Hãy xem trong information_schema:

SELECT * FROM information_schema.triggers; 
+0

SELECT trigger_name FROM information_schema.triggers; hoạt động tốt hơn. – Evgeny

0

Bạn có thể bắt đầu từ truy vấn này, để tìm tên cò outr:

select * from pg_trigger t,pg_proc where 
pg_proc.oid=t.tgfoid 
1

dễ nhất sẽ đến pg_dump -s định nghĩa đối tượng và lọc nó cho các dây chuyền bắt đầu với CREATE TRIGGER.

Something như

./pg_dump -s db_name | grep '^CREATE TRIGGER' | \ 
    while read _ _ triggername _; do \ 
    echo drop trigger "$triggername;"; \ 
    done 

(trong bash) nên làm việc (xem lại nó và sau đó chạy trong cơ sở dữ liệu).

Nhưng có lẽ bạn nên xem xét alter table table_name disable trigger trigger_name thay thế.

2

CẬP NHẬT: Xem giải pháp thực sự cho toàn bộ chức năng bạn muốn.

Alright, tôi đã đưa ra một chức năng mà thực hiện điều này cho tôi:

 
CREATE OR REPLACE FUNCTION strip_all_triggers() RETURNS text AS $$ DECLARE 
     triggNameRecord RECORD; 
    triggTableRecord RECORD; 
BEGIN 
    FOR triggNameRecord IN select distinct(trigger_name) from information_schema.triggers where trigger_schema = 'public' LOOP 
     SELECT distinct(event_object_table) INTO triggTableRecord from information_schema.triggers where trigger_name = triggNameRecord.trigger_name; 
     RAISE NOTICE 'Dropping trigger: % on table: %', triggNameRecord.trigger_name, triggTableRecord.event_object_table; 
     EXECUTE 'DROP TRIGGER ' || triggNameRecord.trigger_name || ' ON ' || triggTableRecord.event_object_table || ';'; 
    END LOOP; 

    RETURN 'done'; 
END; 
$$ LANGUAGE plpgsql SECURITY DEFINER; 

select strip_all_triggers(); 

Điều đó sẽ thả bất kỳ kích hoạt trong schema công cộng của bạn.

2

Đơn giản chỉ cần thả ngôn ngữ mà bạn đã tạo trình kích hoạt.
Ví dụ, tôi có thể tạo trigger trong plpgsql, vì vậy các truy vấn sau đây xóa tất cả gây nên ngay lập tức -

DROP LANGUAGE plpgsql CASCADE; 
0

Tôi thích này (dựa trên that) so với câu trả lời chấp nhận bởi @ kuznetso3v bởi vì nó mang lại cho tôi một cơ hội để kiểm tra các DROP STATEMENT s trước khi thực hiện chúng với sao chép-dán:

SELECT 'DROP TRIGGER ' || trigger_name || ' ON ' || event_object_table || ';' 
FROM information_schema.triggers 
WHERE trigger_schema = 'public'; 
Các vấn đề liên quan