Можете да напишете тригер да се изпълнява всеки път, когато се прави вмъкване/актуализация на определена таблица. Обичайната употреба е да зададете колона "created" или "last_updated" на реда към текущия час, но можете също да актуализирате часа на централно място, ако не искате да промените съществуващите таблици.
Така например типичен начин е следният:
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();
След това, за да намерите последното време за актуализиране, трябва да изберете „MAX(last_updated)“ от всяка таблица, която проследявате, и да вземете най-голямата от тях, напр.:
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
За таблици със сериен (или генериран по подобен начин) първичен ключ можете да опитате да избегнете последователното сканиране, за да намерите най-новото време за актуализиране, като използвате индекса на първичния ключ, или да създадете индекси на last_updated.
-- get timestamp of row with highest id
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1
Обърнете внимание, че това може да даде малко грешни резултати в случай, че идентификаторите не са съвсем последователни, но колко точност ви е необходима? (Имайте предвид, че транзакциите означават, че редовете могат да станат видими за вас в различен ред от създаването им.)
Алтернативен подход за избягване на добавянето на „актуализирани“ колони към всяка таблица е да имате централна таблица, в която да съхранявате клеймото за време и време за актуализиране. Например:
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();
Това ще ви даде таблица с ред за всяка актуализация на таблица:тогава можете просто да направите:
SELECT MAX(updated) FROM update_log
За да получите последно време за актуализиране. (Можете да разделите това по таблица, ако искате). Тази таблица, разбира се, ще продължи да расте:или създайте индекс на „актуализирано“ (което би трябвало да направи получаването на най-новия доста бърз), или я съкращавайте периодично, ако това отговаря на вашия случай на употреба (напр. вземете ексклузивно заключване на таблицата, вземете най-новото време за актуализиране, след което го съкратете, ако трябва периодично да проверявате дали са направени промени).
Алтернативен подход – който може да е това, което хората във форума имаха предвид – е да зададете „log_statement =mod“ в конфигурацията на базата данни (или глобално за клъстера, или на базата данни или потребителя, който трябва да проследявате) и след това всички изрази, които модифицирането на базата данни ще бъде записано в регистрационния файл на сървъра. След това ще трябва да напишете нещо извън базата данни, за да сканирате регистрационния файл на сървъра, да филтрирате таблици, които не ви интересуват и т.н.