PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да намеря последния път, когато база данни на PostgreSQL е актуализирана?

Можете да напишете тригер да се изпълнява всеки път, когато се прави вмъкване/актуализация на определена таблица. Обичайната употреба е да зададете колона "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“ в конфигурацията на базата данни (или глобално за клъстера, или на базата данни или потребителя, който трябва да проследявате) и след това всички изрази, които модифицирането на базата данни ще бъде записано в регистрационния файл на сървъра. След това ще трябва да напишете нещо извън базата данни, за да сканирате регистрационния файл на сървъра, да филтрирате таблици, които не ви интересуват и т.н.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да се свържа с localhost с postgres_fdw?

  2. Postgres - Подаване на името на таблицата като параметър и съхраняване на резултата във файл

  3. Как да направим SUM без групиране по

  4. Какво е правилото за „неизвестен“ и извод за тип?

  5. Докато изпълнявате PITR, възможно ли е да се постави на пауза/възобновяване в PostgreSQL?