You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取Redshift指定数据库中各表的创建及最后修改时间

获取Redshift表的创建与最后修改时间

一、获取表创建时间

使用SVV_TABLE_INFO系统视图,它不受STL系列视图的保留时间限制,能直接获取所有用户表的初始创建时间:

SELECT 
  schemaname,
  tablename,
  createdate AS table_create_time
FROM svv_table_info
WHERE schemaname = '你的目标模式名' -- 替换为实际数据库模式
ORDER BY createdate DESC;

注:createdate记录的是表的首次创建时间,后续执行ALTER TABLE等结构修改操作不会改变这个值。

二、获取表最后修改时间(分场景处理)

Redshift没有原生的长期存储表修改时间的系统视图,需根据需求选择方案:

1. 表结构修改时间(DDL操作)

如果要追踪ALTER TABLE这类结构变更的时间,短期可以查STL_DDLTEXT,但它仅保留2-5天数据。要长期留存,建议自建DDL日志表并定期同步数据:

  • 先创建日志表:
CREATE TABLE ddl_change_log (
  event_time TIMESTAMP,
  username VARCHAR(100),
  schema_name VARCHAR(100),
  table_name VARCHAR(100),
  ddl_command TEXT
);
  • 定期执行以下语句同步最近的DDL操作(可设置为定时任务):
INSERT INTO ddl_change_log
SELECT 
  starttime AS event_time,
  username,
  n.nspname AS schema_name,
  c.relname AS table_name,
  text AS ddl_command
FROM stl_ddltext d
JOIN pg_class c ON d.objid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE starttime > (SELECT COALESCE(MAX(event_time), '1970-01-01') FROM ddl_change_log)
  AND d.text LIKE 'ALTER TABLE%';
  • 查询表结构最后修改时间:
SELECT 
  schema_name,
  table_name,
  MAX(event_time) AS last_ddl_modify_time
FROM ddl_change_log
WHERE schema_name = '你的目标模式名'
GROUP BY schema_name, table_name;

2. 表数据修改时间(DML操作)

如果要追踪INSERT/UPDATE/DELETE这类数据变更的时间,有两种方案:

  • 短期查询方案:利用STL视图获取近期数据,但受保留时间限制:
SELECT 
  n.nspname AS schema_name,
  c.relname AS table_name,
  MAX(q.starttime) AS last_dml_modify_time
FROM stl_query q
JOIN stl_querytext t ON q.query = t.query
JOIN pg_class c ON q.relid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE t.text ILIKE '%INSERT INTO%' 
   OR t.text ILIKE '%UPDATE%' 
   OR t.text ILIKE '%DELETE FROM%'
  AND n.nspname = '你的目标模式名'
GROUP BY n.nspname, c.relname;
  • 长期可靠方案:在表中自定义字段并通过触发器自动更新,这是最稳定的方式:
-- 给现有表添加字段(新建表可直接包含该字段)
ALTER TABLE your_target_table ADD COLUMN last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP;

-- 创建触发器函数
CREATE OR REPLACE FUNCTION update_last_updated()
RETURNS TRIGGER AS $$
BEGIN
  NEW.last_updated = CURRENT_TIMESTAMP;
  RETURN NEW;
END;
$$ LANGUAGE plpgsql;

-- 绑定触发器到表
CREATE TRIGGER trigger_update_last_updated
BEFORE INSERT OR UPDATE ON your_target_table
FOR EACH ROW EXECUTE FUNCTION update_last_updated();
  • 查询数据最后修改时间:
SELECT MAX(last_updated) AS last_data_modify_time FROM your_target_table;

三、注意事项

  • SVV_TABLE_INFO的createdate仅记录初始创建时间,结构修改不会更新该值;
  • STL系列视图仅保留短期数据,长期追踪必须依赖自建日志表或自定义字段方案;
  • 触发器方案对现有表需要手动添加字段并绑定触发器,新建表可直接集成。

内容的提问来源于stack exchange,提问作者Amol

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 00:45:38