Có cách nào tốt để chạy trình kích hoạt cho mỗi bản ghi trong bảng postgres không?


22

Tôi có một hệ thống mà tôi không thể kiểm soát thiết kế của một số bảng (được sao chép qua Slony-I) và vì vậy tôi có một loạt những gì chúng ta gọi là 'bảng bóng', nơi tôi trích xuất một số thông tin từ các bảng được sao chép và lưu trữ nó ở dạng đã xử lý mà tôi cần, trong khi tước bỏ các bản ghi mà tôi muốn bỏ qua.

Ngay bây giờ, sau khi thiết lập một bản sao mới, tôi chạy một bản cập nhật và đặt lại giá trị cho chính nó (ví dụ UPDATE tablename SET field=field:) để buộc kích hoạt chạy, nhưng một số bảng là hàng triệu bản ghi và đang phát triển và có thể mất 30 phút . (và sau đó cũng có vắc-xin).

Có cách nào tốt hơn để kích hoạt nó, hoặc một số cách để viết một hàm sao cho nó sẽ hoạt động với đầu vào được truyền vào hoặc NEWtùy thuộc vào ngữ cảnh cuộc gọi? Tôi miễn cưỡng giữ hai chức năng khác nhau, vì tôi đã thấy quá nhiều lần một cái được cập nhật, và không phải cái kia.


Tôi biết làm thế nào để chạy một kích hoạt ... Tôi hỏi nếu có một cách tốt .
Joe

Câu trả lời:


19

Nó có thể được thực hiện, sử dụng mẫu sau:

CREATE TABLE tablename ( ... );

/* for direct invocation */
CREATE FUNCTION propagate_data(newrow tablename) RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO other_table VALUES (newrow.a, newrow.b, ...);
END:
$$;

/* trigger function wrapper */
CREATE FUNCTION propagate_data_trg() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    PERFORM propagate_data(NEW);
END;
$$;

CREATE TRIGGER propagate_data AFTER INSERT ON tablename FOR EACH ROW
    EXECUTE PROCEDURE propagate_data_trg();

Doh ... Tôi đã suy nghĩ về nó ngược (cố gắng làm cho chức năng kích hoạt có thể gọi được bằng một thủ tục, không phải visa-ngược lại).
Joe

1
Khi tôi thực sự làm điều đó, tôi nhận ra rằng 'hàng' là một từ dành riêng, vì vậy tôi đã sửa lại ví dụ để những người khác sẽ không mất thời gian gỡ lỗi.
Joe

1
Tôi thực sự nên theo dõi nhiều năm trước. Phải mất một thời gian trước khi tôi có thể làm mọi thứ hoạt động trong hệ thống của mình ... và phương pháp này hoạt động, nhưng hiệu suất thật tuyệt vời. (nó đã đi từ 30 phút đến hơn một ngày để hoàn thành).
Joe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.