Giải pháp của bạn khắc phục việc chuyển NEW được nhập theo hàng Biến đổi. Tuy nhiên, bạn có một lỗ hổng chèn SQL lén lút trong mã của mình, điều đó đặc biệt nguy hiểm trong SECURITY DEFINER hàm số. Đầu vào của người dùng phải không bao giờ được chuyển đổi thành mã SQL không thoát.
Vệ sinh như thế này:
CREATE OR REPLACE FUNCTION trg_test_log()
RETURNS trigger AS
$$
BEGIN
EXECUTE 'INSERT INTO public.' || quote_ident('testlog_' || NEW.name)
|| ' SELECT ($1).*'
USING NEW;
RETURN NULL;
END
$$
LANGUAGE plpgsql SECURITY DEFINER;
Ngoài ra:
-
OLDkhông được định nghĩa trongINSERTkích hoạt. - Bạn không cần một biến. Bài tập tương đối đắt trong plpgsql.