puede escribir una trigger para funcionar cada vez que una inserción/actualización se realiza en una mesa particular El uso común es establecer una columna "creada" o "last_updated" de la fila en la hora actual, pero también puede actualizar la hora en una ubicación central si no desea cambiar las tablas existentes.
Así, por ejemplo, una forma típica es la siguiente:
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();
y para buscar el último tiempo de actualización, es necesario seleccionar "MAX (LAST_UPDATED)" de cada tabla está realizando el seguimiento y tomar la mayor de los que, por ejemplo:
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
para las tablas con una clave principal en serie (o similarmente generados), puede intentar evitar la secuencia de exploración para encontrar la última hora de actualización mediante el índice de clave principal, o crear índices en last_updated
-- get timestamp of row with highest id
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1
Tenga en cuenta que esto puede dar resultados poco mal en el caso de las identificaciones no ser bastante secuencial, pero la cantidad de exactitud se puede pedir? (Tenga en cuenta que las transacciones significan que las filas pueden ser visibles para usted en un orden diferente al creado).
Un enfoque alternativo para evitar agregar columnas 'actualizadas' a cada tabla es tener una tabla central para almacenar la actualización marcas de tiempo en, por ejemplo:.
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();
Esto le dará una tabla con una fila para cada actualización de la tabla: a continuación, puede simplemente hacer:
SELECT MAX(updated) FROM update_log
para conseguir la última hora de actualización. (Podrías dividir esto por mesa si quisieras). Esta tabla, por supuesto, seguirá creciendo: cree un índice de "actualizado" (que debería hacer que el último sea bastante rápido) o trunque periódicamente si eso concuerda con su caso de uso (por ejemplo, tome un candado exclusivo en la mesa, obtenga la última hora de actualización, luego trunque si necesita verificar periódicamente si se han realizado cambios).
Un enfoque alternativo, que podría ser lo que significaban las personas en el foro, es establecer 'log_statement = mod' en la configuración de la base de datos (ya sea globalmente para el clúster o en la base de datos o usuario que necesita rastrear) y a continuación, todas las declaraciones que modifican la base de datos se escribirán en el registro del servidor. Luego deberá escribir algo fuera de la base de datos para escanear el registro del servidor, filtrar las tablas que no le interesan, etc.