Đâ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
OLD
vàNEW
cũng nhưTG_RELID
dưới dạng giá trị thànhEXECUTE
vớiUSING
mệnh đề. Bạn có thể phải truyềnTG_RELID
với một kiểu dữ liệu phù hợp. Định nghĩa bảng củatb_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
và$3
trong chuỗi SQL được chuyển tớiEXECUTE
tham khảo các biểu thức trongUSING
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à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$I
và%1$L
là 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
ILIKE
trongDAD_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_user
hoặcsession_user
thay vào đó: -
Bạn có thể xóa
LIMIT 1
từ 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
RETURN
bản tường trình. Cũng có thể làRETURN NULL
cho mộtAFTER
Kí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.