Bảng chuyển đổi của người Viking "trong Postgres là gì?


12

Trang mô tả những gì mới trong Postgres 10 đề cập đến Bảng chuyển đổi cho Triggers.

Bảng chuyển đổi cho Triggers

Tính năng này làm cho AFTER STATEMENTkích hoạt cả hữu ích và hiệu suất bằng cách hiển thị, khi thích hợp, các hàng cũ và mới cho các truy vấn. Trước tính năng này, các AFTER STATEMENTtrình kích hoạt không có quyền truy cập trực tiếp vào các tính năng này và các cách giải quyết là byzantine và có hiệu suất kém. Nhiều logic kích hoạt bây giờ có thể được viết dưới dạng AFTER STATEMENT, tránh việc phải thực hiện các chuyển đổi ngữ cảnh đắt tiền ở mỗi hàng mà M EI kích hoạt ROW yêu cầu.

Bảng chuyển tiếp là gì?

Câu trả lời:


12

Bạn biết làm thế nào có OLDNEWcác biến bản ghi cho FOR EACH ROWkích hoạt?

Bảng chuyển tiếp là FOR EACH STATEMENTtương đương. Chúng là các bảng với bộ dữ liệu cũ và mới, vì vậy trình kích hoạt của bạn có thể thấy những gì đã thay đổi.


9

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 AFTERkích hoạt được chỉ định bằng cách sử dụng REFERENCINGmệnh đề theo cách tiêu chuẩn, các biến hàng được sử dụng trong các FOR EACH ROWkích hoạt có thể không được chỉ định trong REFERENCINGmệ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 REFERENCINGmệ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

  1. Chúng chỉ có sẵn trên các AFTERkích hoạt.
  2. 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 ,.

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.