Anda dapat menulis pemicu untuk dijalankan setiap kali penyisipan/pembaruan dibuat pada tabel tertentu. Penggunaan yang umum adalah menyetel kolom "dibuat" atau "terakhir_diperbarui" dari baris ke waktu saat ini, tetapi Anda juga dapat memperbarui waktu di lokasi pusat jika tidak ingin mengubah tabel yang ada.
Jadi misalnya cara yang khas adalah sebagai berikut:
CREATE FUNCTION stamp_updated() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
BEGIN
NEW.last_updated := now();
RETURN NEW;
END
$$;
-- repeat for each table you need to track:
ALTER TABLE sometable ADD COLUMN last_updated TIMESTAMP;
CREATE TRIGGER sometable_stamp_updated
BEFORE INSERT OR UPDATE ON sometable
FOR EACH ROW EXECUTE PROCEDURE stamp_updated();
Kemudian untuk menemukan waktu pembaruan terakhir, Anda harus memilih "MAX(last_updated)" dari setiap tabel yang Anda lacak dan ambil yang terbesar, mis.:
SELECT MAX(max_last_updated) FROM (
SELECT MAX(last_updated) AS max_last_updated FROM sometable
UNION ALL
SELECT MAX(last_updated) FROM someothertable
) updates
Untuk tabel dengan kunci utama serial (atau yang dibuat serupa), Anda dapat mencoba menghindari pemindaian berurutan untuk menemukan waktu pembaruan terbaru dengan menggunakan indeks kunci utama, atau Anda membuat indeks pada last_updated.
-- get timestamp of row with highest id
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1
Perhatikan bahwa ini dapat memberikan hasil yang sedikit salah jika ID tidak cukup berurutan, tetapi seberapa banyak akurasi yang Anda butuhkan? (Ingatlah bahwa transaksi berarti bahwa baris dapat terlihat oleh Anda dalam urutan yang berbeda dengan yang dibuat.)
Pendekatan alternatif untuk menghindari penambahan kolom 'diperbarui' ke setiap tabel adalah dengan memiliki tabel pusat untuk menyimpan stempel waktu pembaruan. Misalnya:
CREATE TABLE update_log(table_name text PRIMARY KEY, updated timestamp NOT NULL DEFAULT now());
CREATE FUNCTION stamp_update_log() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
BEGIN
INSERT INTO update_log(table_name) VALUES(TG_TABLE_NAME);
RETURN NEW;
END
$$;
-- Repeat for each table you need to track:
CREATE TRIGGER sometable_stamp_update_log
AFTER INSERT OR UPDATE ON sometable
FOR EACH STATEMENT EXECUTE stamp_update_log();
Ini akan memberi Anda tabel dengan baris untuk setiap pembaruan tabel:Anda dapat melakukan:
SELECT MAX(updated) FROM update_log
Untuk mendapatkan waktu pembaruan terakhir. (Anda bisa membagi ini berdasarkan tabel jika Anda mau). Tabel ini tentu saja akan terus bertambah:buat indeks pada 'diperbarui' (yang seharusnya membuat yang terbaru cukup cepat) atau potong secara berkala jika itu sesuai dengan kasus penggunaan Anda, (mis. dapatkan waktu pembaruan terbaru, lalu potong jika Anda perlu memeriksa secara berkala apakah perubahan telah dilakukan).
Pendekatan alternatif - yang mungkin dimaksudkan oleh orang-orang di forum - adalah mengatur 'log_statement =mod' dalam konfigurasi database (baik secara global untuk cluster, atau pada database atau pengguna yang perlu Anda lacak) dan kemudian semua pernyataan yang memodifikasi database akan ditulis ke log server. Anda kemudian harus menulis sesuatu di luar database untuk memindai log server, memfilter tabel yang tidak Anda minati, dll.