Anda dapat menggunakan format()
untuk membuat pembuatan kueri SQL dinamis lebih mudah karena secara otomatis akan menangani pengidentifikasi dan literal dengan benar. Satu hal yang biasanya diabaikan orang adalah Anda dapat memperluas satu ekspresi rekaman ke semua kolomnya menggunakan (...).*
- ini juga berfungsi untuk NEW
dan OLD
merekam variabel dalam pemicu, mis. select (new).*
Anda juga dapat meneruskan variabel ke SQL dinamis dengan using
kata kunci dari execute
penyataan. Tidak perlu mengonversi rekaman bolak-balik antara rekaman dan representasi teks.
Menggunakan kemungkinan itu, fungsi pemicu Anda dapat disederhanakan menjadi:
DECLARE
l_sql text;
BEGIN
IF TG_TABLE_SCHEMA = 'public' THEN
newtable := TG_TABLE_NAME || '_actividad';
ELSE
newtable := TG_TABLE_SCHEMA || '_' || TG_TABLE_NAME || '_actividad';
END IF;
PERFORM creartablaactividad(TG_TABLE_SCHEMA, TG_TABLE_NAME);
l_sql := 'INSERT INTO actividad.%I SELECT current_user, current_timestamp, %L, ($1).*';
IF TG_OP = 'DELETE' THEN
execute format(l_sql, newtable, 'D') using OLD;
RETURN OLD;
ELSE
-- covers UPDATE and INSERT
execute format(l_sql, newtable, 'U') using NEW;
RETURN NEW;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
Menggunakan placeholder seperti %I
dan %L
juga memungkinkan untuk mendefinisikan SQL aktual hanya sekali dan menggunakannya kembali. "Parameter" tersebut diganti dengan format()
fungsi (yang mempertahankan $1
)
Perhatikan penggunaan ($1).*
di dalam string SQL. Itu akan membuat execute
pernyataan memperluas parameter record $1
ke semua kolomnya. Catatan itu sendiri diteruskan "asli" dengan USING
kata kunci.
Penggunaan INSERT
tanpa daftar kolom target (insert into some_table ...
alih-alih insert into some_table (col1, col2, ...) ...
) adalah hal yang cukup rapuh untuk dilakukan. Jika sumber dan target tidak cocok, sisipan bisa gagal dengan mudah. .
Jika Anda tidak menjalankan pelaporan besar-besaran pada tabel audit (di mana memiliki nama kolom eksplisit akan jauh lebih efisien), Anda mungkin ingin memikirkan pemicu audit yang lebih umum menggunakan JSON
atau HSTORE
kolom untuk menyimpan seluruh record. Ada beberapa pemicu audit siap pakai yang tersedia:
- http://okbob.blogspot. de/2015/01/most-simply-implementation-of-history.html
- https://github.com/wingspan/wingspan-auditing
- https://www.cybertec-postgresql.com /en/tracking-changes-in-postgresql/
- https://wiki.postgresql.org/wiki/Audit_trigger_91plus