PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara menggunakan pengaturan variabel dalam fungsi pemicu?

Tangani semua kemungkinan kasus untuk opsi yang disesuaikan dengan benar:

  1. opsi belum disetel

    Semua referensi untuk itu memunculkan pengecualian , termasuk current_setting() kecuali dipanggil dengan parameter kedua missing_ok . Manual:

  2. opsi disetel ke literal integer yang valid

  3. opsi disetel ke literal integer yang tidak valid

  4. pilihan reset (yang membakar ke kasus khusus 3. )

    Misalnya, jika Anda menyetel opsi yang disesuaikan dengan SET LOCAL atau set_config('myvars.user_id3', '55', true) , nilai opsi direset pada akhir transaksi. Masih ada , dapat direferensikan, tetapi mengembalikan string kosong sekarang ('' ) - yang tidak dapat dilemparkan ke integer .

Di samping kesalahan yang jelas dalam demo Anda, Anda perlu mempersiapkan semua 4 kasus. Jadi:

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 di sini

Catatan:

  • Hindari nama variabel yang cocok dengan nama kolom. Sangat rawan kesalahan. Salah satu konvensi penamaan yang populer adalah menambahkan nama variabel dengan garis bawah:_user_id .

  • Tetapkan pada waktu deklarasi untuk menyimpan satu tugas. Perhatikan tipe data text . Kami akan mentransmisikan nanti, setelah memilah input yang tidak valid.

  • Hindari menaikkan / menjebak pengecualian jika memungkinkan . Manual:

  • Uji string bilangan bulat yang valid. Ekspresi reguler sederhana ini hanya mengizinkan digit (tanpa tanda awal, tanpa spasi):_user_id ~ '^\d+$' . Saya mengatur ulang ke NULL untuk input yang tidak valid. Sesuaikan dengan kebutuhan Anda.

  • Saya menambahkan WARNING opsional untuk kenyamanan debug Anda.

  • Kasus 3. dan 4. hanya muncul karena opsi yang disesuaikan adalah string literal (ketik text ), tipe data yang valid tidak dapat diterapkan secara otomatis.

Terkait:

Selain itu, mungkin ada solusi yang lebih elegan untuk apa yang Anda coba lakukan tanpa opsi yang disesuaikan, tergantung pada kebutuhan Anda. Mungkin ini:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan Barman untuk Pemulihan Bencana PostgreSQL

  2. kesalahan psycopg, kolom tidak ada

  3. Hitung baris setelah bergabung dengan tiga tabel di PostgreSQL

  4. Bagaimana cara mengubah array 2d dari PostgreSQL DB ke array Java 2d menggunakan JDBI?

  5. Bagaimana Anda menambahkan Driver PostgreSQL sebagai ketergantungan di Maven?