2008-11-20 25 views
19

Tôi có Trình kích hoạt này trong Postgresql mà tôi không thể chỉ hoạt động (không có gì). Để hiểu, có cách tôi đã xác định:gỡ lỗi kích hoạt postgresql

CREATE TABLE documents (
    ... 
    modification_time timestamp with time zone DEFAULT now() 
); 

CREATE FUNCTION documents_update_mod_time() RETURNS trigger 
AS $$ 
    begin 
    new.modification_time := now(); 
    return new; 
    end 
$$ 
    LANGUAGE plpgsql; 

CREATE TRIGGER documents_modification_time 
    BEFORE INSERT OR UPDATE ON documents 
    FOR EACH ROW 
    EXECUTE PROCEDURE documents_update_mod_time(); 

Bây giờ để làm cho nó thú vị hơn một chút .. Làm cách nào để bạn kích hoạt gỡ lỗi?

+0

Điều này không liên quan chặt chẽ, nhưng bạn có thể thấy nó hữu ích trong cuộc phiêu lưu pgsql của bạn anyway: http://stackoverflow.com/questions/430123/how-do-i-enable-the-postgresql-function -profiler – Kev

Trả lời

41
  1. Sử dụng đoạn mã sau trong vòng một hàm kích hoạt, sau đó xem tab 'thông điệp' trong pgAdmin3 hoặc đầu ra trong psql:

    RAISE NOTICE 'myplpgsqlval is currently %', myplpgsqlval;  -- either this 
    RAISE EXCEPTION 'failed'; -- or that 
    
  2. Để xem những gây nên thực sự được gọi là, có bao nhiêu lần vv, tuyên bố sau là cuộc sống tiết kiệm của sự lựa chọn:

    EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers 
    

    Lưu ý rằng nếu kích hoạt của bạn không nhận được gọi và bạn sử dụng thừa kế, nó có thể là thứ tại bạn chỉ xác định trình kích hoạt trên bảng cha, trong khi trình kích hoạt không được tự động thừa kế bởi các bảng con.

  3. Để thực hiện chức năng này, bạn có thể sử dụng trình gỡ rối được tích hợp vào pgAdmin3, mà trên Windows được bật theo mặc định; tất cả những gì bạn phải làm là thực thi mã được tìm thấy trong ... \ 8.3 \ share \ contrib \ pldbgapi.sql đối với cơ sở dữ liệu bạn đang gỡ lỗi, khởi động lại pgAdmin3, nhấp chuột phải vào chức năng kích hoạt của bạn, nhấn 'Đặt điểm ngắt', và sau đó thực thi một câu lệnh có thể làm cho trigger kích hoạt, chẳng hạn như câu lệnh UPDATE ở trên.

+0

Không chắc đây có phải là cách thực hiện trên các nền tảng khác không. Ngoài ra tôi đã chia sẻ phương pháp thứ ba trước đó (nó thực sự * tiện dụng!) Nhưng tôi thấy điều này trong một tuần sau khi câu hỏi này ban đầu được đăng. – Kev

+1

Đã thử với Postgres 9.2 và pgAdmin đi kèm. Không có menu Set Breakpoint ở bất cứ đâu ngay cả sau khi thực hiện theo các hướng dẫn nêu trên. Ngoài ra tập tin nằm ở ... \ 9.2 \ share \ extension \ pldbgapi-1.0.sql. Hệ điều hành: Windows Server 2008 – Dojo

3

Bạn có thể sử dụng câu lệnh 'thông báo nâng cao' bên trong hàm kích hoạt để gỡ lỗi. Để gỡ lỗi trình kích hoạt không được gọi là một câu chuyện khác.

Nếu bạn thêm 'ngoại lệ tăng lên' bên trong chức năng kích hoạt, bạn vẫn có thể thực hiện chèn/cập nhật không?

Ngoài ra, nếu kiểm tra cập nhật của bạn xảy ra trong cùng một giao dịch như kiểm tra chèn, bây giờ() sẽ giống nhau (vì nó chỉ được tính một lần cho mỗi giao dịch) và do đó bản cập nhật dường như không làm gì cả. Nếu đó là trường hợp, hoặc là làm chúng trong các giao dịch riêng biệt, hoặc nếu đây là một thử nghiệm đơn vị và bạn không thể làm điều đó, sử dụng clock_timestamp().

Tôi có một bài kiểm tra đơn vị đó phụ thuộc vào một số thời gian đi bằng giữa giao dịch, vì vậy ở phần đầu của bài kiểm tra đơn vị tôi có một cái gì đó như:

ALTER TABLE documents 
    ALTER COLUMN modification_time SET DEFAULT clock_timestamp(); 

Sau đó, trong kích hoạt, sử dụng "thiết lập modification_time = mặc định ".

Vì vậy, thông thường nó không thực hiện phép tính bổ sung, nhưng trong khi kiểm tra đơn vị, điều này cho phép tôi thực hiện chèn với pg_sleep ở giữa để mô phỏng thời gian trôi qua và thực sự được phản ánh trong dữ liệu.

+0

gợi ý tốt ... do đó, nó xuất hiện các chức năng không được gọi là .. bất kỳ ý tưởng tại sao? –

+0

Bạn có quyền thực hiện trên chức năng kích hoạt không? – Kev

+0

Bạn có thể muốn đủ điều kiện (thêm tên lược đồ) tên của các đối tượng khác nhau, chỉ để ở bên an toàn. Ngoài ra, bạn có thể bỏ qua phần "CH INSN" của định nghĩa kích hoạt, giá trị mặc định sẽ xử lý trường hợp này. –

2

Hóa ra tôi đã sử dụng thừa kế trong vấn đề trên và quên đề cập đến nó. Bây giờ cho tất cả mọi người có thể chạy vào trong này là tốt, đây là một số gợi ý gỡ lỗi:

Sử dụng đoạn mã sau để gỡ lỗi những gì một kích hoạt được thực hiện:

RAISE NOTICE 'test';  -- either this 
RAISE EXCEPTION 'failed'; -- or that 

Để xem những gây nên thực sự được gọi là, bao nhiêu lần vv, tuyên bố sau là cuộc sống tiết kiệm của sự lựa chọn:

EXPLAIN ANALYZE UPDATE table SET foo='bar'; -- shows the called triggers 

Tiếp theo là một điều tôi không biết trước: chỉ kích hoạt lửa khi cập nhật bảng chính xác chúng được xác định trên. Nếu bạn sử dụng thừa kế, bạn PHẢI xác định chúng trên các bảng con!

+0

Bạn nên đăng chéo miếng đó tại http://www.postgresql.org/docs /8.3/interactive/ddl-inherit.html – Kev

Các vấn đề liên quan