Tangani semua kemungkinan kasus untuk opsi yang disesuaikan dengan benar:
-
opsi belum disetel
Semua referensi untuk itu memunculkan pengecualian , termasuk
current_setting()
kecuali dipanggil dengan parameter keduamissing_ok
. Manual: -
opsi disetel ke literal integer yang valid
-
opsi disetel ke literal integer yang tidak valid
-
pilihan reset (yang membakar ke kasus khusus 3. )
Misalnya, jika Anda menyetel opsi yang disesuaikan dengan
SET LOCAL
atauset_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 keinteger
.
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.
dan4.
hanya muncul karena opsi yang disesuaikan adalah string literal (ketiktext
), tipe data yang valid tidak dapat diterapkan secara otomatis.
Terkait:
- Variabel yang ditentukan pengguna di PostgreSQL
- Apakah ada cara untuk mendefinisikan konstanta bernama dalam kueri PostgreSQL?
Selain itu, mungkin ada solusi yang lebih elegan untuk apa yang Anda coba lakukan tanpa opsi yang disesuaikan, tergantung pada kebutuhan Anda. Mungkin ini: