PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để lưu dữ liệu có ký tự thay đổi dấu phẩy chuyển qua trình kích hoạt?

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 NEWOLD 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%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:




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vui lòng đề xuất tùy chọn xóa hàng loạt tốt nhất

  2. Rails + Postgres:Không trả lại thông tin múi giờ trên cột từ bảng đã tham gia

  3. Nâng cấp lên PostgreSQL13

  4. PostgreSQL:sự cố mã hóa trên Windows khi sử dụng tiện ích dòng lệnh psql

  5. Cách cài đặt PyGreSQL bằng Virtualenv trên Mac OS Sierra