Xử lý tất cả các trường hợp có thể xảy ra đối với tùy chọn tùy chỉnh đúng cách:
-
tùy chọn chưa được thiết lập
Tất cả các tham chiếu đến nó nêu lên một ngoại lệ , bao gồm
current_setting()
trừ khi được gọi với tham số thứ haimissing_ok
. Hướng dẫn sử dụng: -
tùy chọn được đặt thành một chữ số nguyên hợp lệ
-
tùy chọn được đặt thành một chữ số nguyên không hợp lệ
-
đặt lại tùy chọn (ghi vào trường hợp đặc biệt của 3. )
Ví dụ:nếu bạn đặt tùy chọn tùy chỉnh với
SET LOCAL
hoặcset_config('myvars.user_id3', '55', true)
, giá trị quyền chọn được đặt lại khi kết thúc giao dịch. Nó vẫn tồn tại , có thể được tham chiếu, nhưng nó trả về một chuỗi trống bây giờ (''
) - không thể chuyển thànhinteger
.
Bỏ qua những sai lầm rõ ràng trong bản demo của bạn, bạn cần chuẩn bị cho cả 4 trường hợp. Vì vậy:
CREATE OR REPLACE FUNCTION add_transition1()
RETURNS trigger AS
$func$
DECLARE
_user_id text := current_setting('myvars.user_id', true); -- see 1.
BEGIN
IF _user_id ~ '^\d+$' THEN -- one or more digits?
INSERT INTO transitions1 (user_id, house_id)
VALUES (_user_id::int, NEW.id); -- valid int, cast is safe
ELSE
INSERT INTO transitions1 (user_id, house_id)
VALUES (NULL, NEW.id); -- use NULL instead
RAISE WARNING 'Invalid user_id % for house_id % was reset to NULL!'
, quote_literal(_user_id), NEW.id; -- optional
END IF;
RETURN NULL; -- OK for AFTER trigger
END
$func$ LANGUAGE plpgsql;
db <> fiddle tại đây
Ghi chú:
-
Tránh các tên biến trùng với tên cột. Rất dễ xảy ra lỗi. Một quy ước đặt tên phổ biến là thêm vào trước các tên biến với dấu gạch dưới:
_user_id
. -
Gán tại thời điểm khai báo để lưu một nhiệm vụ. Lưu ý kiểu dữ liệu
text
. Chúng tôi sẽ truyền sau, sau khi phân loại đầu vào không hợp lệ. -
Tránh nâng cao / bẫy một ngoại lệ nếu có thể . Sách hướng dẫn:
-
Kiểm tra các chuỗi số nguyên hợp lệ. Biểu thức chính quy đơn giản này chỉ cho phép các chữ số (không có dấu ở đầu, không có khoảng trắng):
_user_id ~ '^\d+$'
. Tôi đặt lại thành NULL cho bất kỳ đầu vào không hợp lệ nào. Thích ứng với nhu cầu của bạn. -
Tôi đã thêm một
WARNING
tùy chọn để thuận tiện cho việc gỡ lỗi của bạn. -
Các trường hợp
3.
và4.
chỉ phát sinh vì các tùy chọn tùy chỉnh là các ký tự chuỗi (nhậptext
), các loại dữ liệu hợp lệ không thể được thực thi tự động.
Có liên quan:
- Biến do người dùng xác định trong PostgreSQL
- Có cách nào để xác định hằng số được đặt tên trong truy vấn PostgreSQL không?
Tất cả những điều đó sang một bên, có thể có các giải pháp thanh lịch hơn cho những gì bạn đang cố gắng thực hiện mà không có các tùy chọn tùy chỉnh, tùy thuộc vào yêu cầu chính xác của bạn. Có thể thế này: