Tôi đang viết một kích hoạt xác nhận. Kích hoạt phải xác nhận rằng tổng của một mảng bằng với một trường khác. Vì tôi có nhiều phiên bản xác thực này, tôi muốn viết một thủ tục duy nhất và tạo nhiều kích hoạt, mỗi kích hoạt có một bộ trường khác nhau để kiểm tra.
Ví dụ, tôi có lược đồ sau:
CREATE TABLE daily_reports(
start_on date
, show_id uuid
, primary key(start_on, show_id)
-- _graph are hourly values, while _count is total for the report
, impressions_count bigint not null
, impressions_graph bigint[] not null
-- interactions_count, interactions_graph
-- twitter_interactions_count, twitter_interactions_graph
);
Việc xác nhận phải xác nhận rằng impressions_count = sum(impressions_graph)
.
Tôi bị kẹt vì tôi không biết cách truy cập động một trường NEW
từ bên trong plpgsql:
CREATE FUNCTION validate_sum_of_array_equals_other() RETURNS TRIGGER AS $$
DECLARE
total bigint;
array_sum bigint;
BEGIN
-- TG_NARGS = 2
-- TG_ARGV[0] = 'impressions_count'
-- TG_ARGV[1] = 'impressions_graph'
-- How to access impressions_count and impressions_graph from NEW?
RETURN NEW;
END
$$ LANGUAGE plpgsql;
CREATE TRIGGER validate_daily_reports_impressions
ON daily_reports BEFORE INSERT OR UPDATE
FOR EACH ROW EXECUTE
validate_sum_of_array_equals_other('impressions_count', 'impressions_graph');
Tôi đã thử Thực thi các lệnh động bằng cách thực hiện EXECUTE 'SELECT $1 FROM NEW' INTO total USING TG_ARGV[0]
, nhưng PL / PGsql phàn nàn rằng MỚI là một mối quan hệ không xác định.
Tôi đặc biệt nhắm mục tiêu PostgreSQL 9.1.
NEW
thời điểm này là sử dụng hstore(NEW)
và sau đó truy cập vào các trường dưới dạng hstore
các giá trị được khóa theo tên cột. Thật tệ, bởi vì sau đó tất cả họ đều được chọn text
và nếu bạn muốn làm việc với họ theo kiểu ban đầu, bạn phải bỏ họ lại. Thay phiên, bạn có thể viết một trình kích hoạt bằng ngôn ngữ thủ tục khác như PL / Python có hỗ trợ tốt hơn cho truy cập bản ghi động.