Bạn có thể sử dụng format()
để làm cho việc tạo một truy vấn SQL động dễ dàng hơn nhiều vì nó sẽ tự động xử lý các số nhận dạng và các ký tự một cách chính xác. Một điều mà mọi người thường bỏ qua là bạn có thể mở rộng một biểu thức bản ghi duy nhất cho tất cả các cột của nó bằng cách sử dụng (...).*
- điều này cũng hoạt động cho NEW
và OLD
ghi lại các biến trong một trình kích hoạt, ví dụ:select (new).*
Bạn cũng có thể chuyển các biến vào SQL động bằng using
từ khóa của execute
bản tường trình. Không cần phải chuyển đổi bản ghi qua lại giữa bản ghi và biểu diễn văn bản.
Sử dụng khả năng đó, chức năng kích hoạt của bạn có thể được đơn giản hóa thành:
DECLARE
l_sql text;
BEGIN
IF TG_TABLE_SCHEMA = 'public' THEN
newtable := TG_TABLE_NAME || '_actividad';
ELSE
newtable := TG_TABLE_SCHEMA || '_' || TG_TABLE_NAME || '_actividad';
END IF;
PERFORM creartablaactividad(TG_TABLE_SCHEMA, TG_TABLE_NAME);
l_sql := 'INSERT INTO actividad.%I SELECT current_user, current_timestamp, %L, ($1).*';
IF TG_OP = 'DELETE' THEN
execute format(l_sql, newtable, 'D') using OLD;
RETURN OLD;
ELSE
-- covers UPDATE and INSERT
execute format(l_sql, newtable, 'U') using NEW;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
Sử dụng trình giữ chỗ như %I
và %L
cũng làm cho nó có thể xác định SQL thực tế chỉ một lần và sử dụng lại nó. Các "tham số" đó được thay thế bằng format()
hàm (giữ nguyên $1
)
Lưu ý việc sử dụng ($1).*
bên trong chuỗi SQL. Điều đó sẽ làm cho execute
câu lệnh mở rộng tham số bản ghi $1
cho tất cả các cột của nó. Bản thân bản ghi được chuyển "nguyên bản" với USING
từ khóa.
Việc sử dụng INSERT
không có danh sách cột mục tiêu (insert into some_table ...
thay vì chèn insert into some_table (col1, col2, ...) ...
) là một điều khá mong manh để làm. Nếu nguồn và đích không khớp với nhau, chèn có thể bị lỗi khá dễ dàng. .
Nếu bạn không chạy báo cáo lớn trên các bảng kiểm tra (nơi có tên cột rõ ràng sẽ hiệu quả hơn nhiều), bạn có thể muốn nghĩ đến một trình kích hoạt kiểm tra chung chung hơn bằng cách sử dụng JSON
hoặc HSTORE
cột để lưu trữ toàn bộ bản ghi. Có một số trình kích hoạt kiểm tra được tạo sẵn có sẵn:
- http://okbob.blogspot. de / 2015/01 / most-simple-implement-of-history.html
- https://github.com/wingspan/wingspan-auditing
- https://www.cybertec-postgresql.com / vi / tracking-changes-in-postgresql /
- https://wiki.postgresql.org/wiki/Audit_trigger_91plus