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

Làm thế nào để sử dụng cài đặt biến trong các chức năng kích hoạt?

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:

  1. 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ứ hai missing_ok . Hướng dẫn sử dụng:

  2. tùy chọn được đặt thành một chữ số nguyên hợp lệ

  3. tùy chọn được đặt thành một chữ số nguyên không hợp lệ

  4. đặ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ặc set_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ành integer .

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.4. chỉ phát sinh vì các tùy chọn tùy chỉnh là các ký tự chuỗi (nhập text ), các loại dữ liệu hợp lệ không thể được thực thi tự động.

Có liên quan:

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:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để tăng nặng số nguyên trong postgresql?

  2. Tổng quan về xử lý VACUUM trong PostgreSQL

  3. Chọn nhiều giá trị hàng thành một hàng duy nhất với các mệnh đề nhiều bảng

  4. PostgreSQL:Nhóm sau đó lọc bảng, với điều kiện không tồn tại

  5. Nhịp tim của Debezium Postgres Kafka Connector không phạm LSN