Đâ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
OLDvàNEWcũng nhưTG_RELIDdưới dạng giá trị thànhEXECUTEvớiUSINGmệnh đề. Bạn có thể phải truyềnTG_RELIDvới một kiểu dữ liệu phù hợp. Định nghĩa bảng củatb_modificacoeskhô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,$2và$3trong chuỗi SQL được chuyển tớiEXECUTEtham khảo các biểu thức trongUSINGmệ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àiEXECUTE. -
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 , mã và giá trị đúng!%1$Ivà%1$Llà các chỉ định định dạng choformat(). Đọ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
ILIKEtrongDAD_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 trongdad_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ằngdad_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_userhoặcsession_userthay vào đó: -
Bạn có thể xóa
LIMIT 1từ truy vấn con ifdad_nomeđược định nghĩaUNIQUE. 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ớiORDER BY. -
Chức năng trình kích hoạt là bắt buộc để kết thúc bằng
RETURNbản tường trình. Cũng có thể làRETURN NULLcho mộtAFTERKích hoạt. Hướng dẫn sử dụng:
Có liên quan:
- Cách chuyển NEW. * Để THỰC HIỆN trong chức năng kích hoạt
- Thay thế dấu ngoặc kép bằng dấu ngoặc kép trong Postgres (plpgsql)
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.