Как я нахожу в прошлый раз, когда база данных PostgreSQL была обновлена?

В дополнение к настройке scrollbind в обоих буферах вам необходимо выполнить команду :syncbind. Это должно синхронизировать прокрутку. Я не знаю, будет ли это хорошо, если вы переносите строки, а два файла имеют строки разной длины. Но если вы выключите перенос, я думаю, что они должны оставаться с одинаковыми номерами строк.

20
задан WolfmanDragon 22 May 2009 в 18:23
поделиться

2 ответа

Вы можете написать триггер , который будет запускаться каждый раз при вставке / обновлении определенной таблицы. Обычно используется установка текущего времени в столбце 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' в конфигурация базы данных (либо глобально для кластера, либо для базы данных или пользователя, которого вы должны отслеживать), а затем все операторы, которые изменяют базу данных, будут записаны в журнал сервера. Затем вам нужно будет написать что-то вне базы данных для сканирования журнала сервера, фильтрации таблиц, которые вам не интересны, и т. Д.

или в базе данных или пользователя, которого вы должны отслеживать), а затем все операторы, которые изменяют базу данных, будут записаны в журнал сервера. Затем вам нужно будет написать что-то вне базы данных для сканирования журнала сервера, фильтрации таблиц, которые вам не интересны, и т. Д.

или в базе данных или пользователя, которого вы должны отслеживать), а затем все операторы, которые изменяют базу данных, будут записаны в журнал сервера. Затем вам нужно будет написать что-то вне базы данных для сканирования журнала сервера, фильтрации таблиц, которые вам не интересны, и т. Д.

26
ответ дан 30 November 2019 в 00:05
поделиться

См. Следующую статью:

MySQL против PostgreSQL: добавление столбца «Время последнего изменения» в стол http://www.pointbeing.net/weblog/2008/03/mysql-versus-postgresql-adding-a-last-modified-column-to-a-table.html

2
ответ дан 30 November 2019 в 00:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: