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

Làm cách nào để chuyển CŨ, MỚI và số nhận dạng để THỰC HIỆN trong một hàm kích hoạt?

Đây là cách chức năng kích hoạt của bạn hoạt động bình thường:

CREATE OR REPLACE FUNCTION loca_app.func_historico_mod_usuarios()
  RETURNS trigger AS
$func$
BEGIN
   EXECUTE format(
      'INSERT INTO loca_app.tb_modificacoes
              (mod_momento, mod_valor_anterior, mod_valor_atual, mod_usuario, mod_dado)
       VALUES (now()      , $1.%1$I           , $2.%1$I        , $3         , $4)

              )', TG_ARGV[0])
   USING OLD, NEW, TG_RELID
      , (SELECT dad_id FROM loca_app.tb_dados
         WHERE  dad_nome = TG_ARGV[0]  -- cast? see blow
         LIMIT  1);

   RETURN NULL;  -- only good for AFTER trigger
END
$func$ LANGUAGE plpgsql;

Những điểm chính

  • Chuyển các giá trị hàng đặc biệt OLDNEW cũng như TG_RELID dưới dạng giá trị thành EXECUTE với USING mệnh đề. Bạn có thể phải truyền TG_RELID với một kiểu dữ liệu phù hợp. Định nghĩa bảng của tb_modificacoes không được tiết lộ. Hoặc bạn thực sự muốn một cái gì đó khác ở đây. Xem bên dưới.
    $1 , $2$3 trong chuỗi SQL được chuyển tới EXECUTE tham khảo các biểu thức trong USING mệnh đề, không đến các tham số hàm, có thể được tham chiếu với cùng một cú pháp vị trí trong thân hàm bên ngoài EXECUTE .

  • Nối lệnh SQL động của bạn bằng cách sử dụng format() . Sạch sẽ và an toàn hơn nhiều. Trích dẫn và thoát số nhận dạng , giá trị đúng! %1$I%1$L là các chỉ định định dạng cho format() . Đọc hướng dẫn để biết chi tiết.

  • Yêu cầu đúng trường hợp! Quy ước của bạn để đánh vần các số nhận dạng với các chữ cái viết hoa có ý nghĩa trong Oracle, trong đó các số nhận dạng không được trích dẫn sẽ được chuyển đổi thành các chữ cái viết hoa. Nó không hữu ích trong Postgres, nơi mà mọi thứ được gấp lại thành chữ thường:

  • Không sử dụng ILIKE trong DAD_NOME ILIKE 'USU_NASCIMENTO' . Số nhận dạng postgres có phân biệt chữ hoa chữ thường. Bạn có thể có nhiều giá trị phù hợp trong dad_nome . Sử dụng = thay vào đó và chuyển các số nhận dạng đúng chính tả. Và đảm bảo rằng dad_nome được xác định là duy nhất. Xem bên dưới.

  • Nhận xét của bạn cho biết:MOD_USUARIO , -- Translated to: User (ID) . Nhưng đó không phải là những gì bạn vượt qua. Hướng dẫn sử dụng:

    Bạn có thể muốn sử dụng current_user hoặc session_user thay vào đó:

  • Bạn có thể xóa LIMIT 1 từ truy vấn con if dad_nome được định nghĩa UNIQUE . Nếu không, bạn cần quyết định chọn hàng nào trong trường hợp hòa - với ORDER BY .

  • Chức năng trình kích hoạt là bắt buộc để kết thúc bằng RETURN bản tường trình. Cũng có thể là RETURN NULL cho một AFTER Kích hoạt. Hướng dẫn sử dụng:

Có liên quan:

Bên cạnh: Trong khi bạn chưa quen với Postgres, bạn có thể muốn sử dụng loại SQL động nâng cao này một cách cẩn thận. Bạn cần hiểu những gì bạn đang làm.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Không thể nhập .csv vào Cloud SQL từ bảng điều khiển

  2. Lỗi chuỗi byte không hợp lệ khi khôi phục cơ sở dữ liệu PostgreSQL

  3. Tạo một số ngẫu nhiên trong phạm vi 1 - 10

  4. TypeORM có điều kiện nullable?

  5. Tôi có thể lưu trữ bao nhiêu bản ghi trong 5 MB PostgreSQL trên Heroku?