Tôi thực sự thích lời giải thích của Craig về tính năng này. Đặc tả SQL-2011 định nghĩa chúng trong ngữ cảnh của trình kích hoạt là "tập hợp các hàng bị xóa, chèn hoặc thay thế được gọi là bảng chuyển tiếp." Một lời giải thích tương tự được cung cấp trong các tài liệu,
Trong khi các bảng chuyển đổi cho các AFTER
kích hoạt được chỉ định bằng cách sử dụng REFERENCING
mệnh đề theo cách tiêu chuẩn, các biến hàng được sử dụng trong các FOR EACH ROW
kích hoạt có thể không được chỉ định trong REFERENCING
mệnh đề. Chúng có sẵn theo cách phụ thuộc vào ngôn ngữ mà chức năng kích hoạt được viết. Một số ngôn ngữ hoạt động hiệu quả như thể có một REFERENCING
mệnh đề chứaOLD ROW AS OLD NEW ROW AS NEW.
Về cơ bản, chúng làm cho toàn bộ các thay đổi của tuyên bố có sẵn cho bạn, siêu tiện dụng. Để tham khảo, DDL khi tạo trình kích hoạt trông như thế này với các bảng chuyển tiếp
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
Bạn có thể xem một ví dụ ở đây và đây là một ví dụ từ bộ thử nghiệm ,
CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);
CREATE FUNCTION transition_table_base_ins_func()
RETURNS trigger
LANGUAGE plpgsql
AS $$
DECLARE
t text;
l text;
BEGIN
t = '';
FOR l IN EXECUTE
$q$
EXPLAIN (TIMING off, COSTS off, VERBOSE on)
SELECT * FROM newtable
$q$ LOOP
t = t || l || E'\n';
END LOOP;
RAISE INFO '%', t;
RETURN new;
END;
$$;
CREATE TRIGGER transition_table_base_ins_trig
AFTER INSERT ON transition_table_base
REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
FOR EACH STATEMENT
EXECUTE PROCEDURE transition_table_base_ins_func();
Một số ghi chú bổ sung
- Chúng chỉ có sẵn trên các
AFTER
kích hoạt.
- Họ tính đến những thứ như
ON CONFLICT
.
Điều quan trọng là chỉ ra rằng nó không hoàn toàn chắc chắn có sẵn trong PG 10 . Có rất nhiều vấn đề mở với các bảng chuyển tiếp . Hầu hết đều có bản vá. Có một số đấu đá là loại thường lệ. Có vẻ như việc nâng vật nặng đã được người khác nhặt lên. Các chủ đề chỉ ra rằng chúng ta sẽ sớm biết.
Tác giả đã trả lời - dường như sẽ tốt trở lại ,.