PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak znaleźć ostatnią aktualizację bazy danych PostgreSQL?

Możesz napisać wyzwalacz uruchamiany za każdym razem, gdy w określonej tabeli zostanie wykonana wstawka/aktualizacja. Typowym zastosowaniem jest ustawienie kolumny „created” lub „last_updated” wiersza na bieżący czas, ale możesz również zaktualizować godzinę w centralnej lokalizacji, jeśli nie chcesz zmieniać istniejących tabel.

Na przykład typowy sposób jest następujący:

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();

Następnie, aby znaleźć czas ostatniej aktualizacji, musisz wybrać „MAX(last_updated)” z każdej śledzonej tabeli i wybrać największą z nich, np.:

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

W przypadku tabel z seryjnym (lub podobnie wygenerowanym) kluczem podstawowym możesz spróbować uniknąć skanowania sekwencyjnego w celu znalezienia ostatniego czasu aktualizacji przy użyciu indeksu klucza podstawowego lub utworzyć indeksy na last_updated.

-- get timestamp of row with highest id
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1

Zauważ, że może to dać nieco błędne wyniki w przypadku, gdy identyfikatory nie są całkiem sekwencyjne, ale jak dużej dokładności potrzebujesz? (Pamiętaj, że transakcje oznaczają, że wiersze mogą być dla Ciebie widoczne w innej kolejności niż ich tworzenie).

Alternatywnym sposobem uniknięcia dodawania „zaktualizowanych” kolumn do każdej tabeli jest posiadanie centralnej tabeli do przechowywania sygnatur czasowych aktualizacji. Na przykład:

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();

W ten sposób otrzymasz tabelę z wierszem dla każdej aktualizacji tabeli:możesz po prostu wykonać:

SELECT MAX(updated) FROM update_log

Aby uzyskać czas ostatniej aktualizacji. (Możesz podzielić to według tabeli, jeśli chcesz). Ta tabela będzie oczywiście stale rosła:albo utwórz indeks dla „zaktualizowanych” (co powinno sprawić, że otrzymanie najnowszego będzie dość szybkie) lub obcinaj go okresowo, jeśli pasuje to do twojego przypadku użycia (np. weź wyłączną blokadę na tabelę, pobierz najnowszy czas aktualizacji, a następnie skróć go, jeśli musisz okresowo sprawdzać, czy dokonano zmian).

Alternatywnym podejściem – które może być tym, co mieli na myśli ludzie na forum – jest ustawienie „log_statement =mod” w konfiguracji bazy danych (albo globalnie dla klastra, albo dla bazy danych lub użytkownika, którego musisz śledzić), a następnie wszystkich oświadczeń, które modyfikacja bazy danych zostanie zapisana w dzienniku serwera. Następnie będziesz musiał napisać coś poza bazą danych, aby przeskanować dziennik serwera, odfiltrować tabele, którymi nie jesteś zainteresowany itp.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można uruchomić postgresql.service?

  2. Pokazać wszystkie wyniki w postgresql?

  3. Postgresql:Skryptowanie wykonania psql z hasłem

  4. Jak przechowywać ustawienia dla całej witryny w bazie danych?

  5. Wstaw wiele wartości ENUM w PostgreSQL