我们正在 Redshift 集群上运行少量每小时脚本,这些脚本为数据消费者构建汇总表。组装临时表后,脚本然后运行一个事务,删除现有表并将其替换为临时表,如下所示:
BEGIN;
DROP TABLE IF EXISTS public.data_facts;
ALTER TABLE public.data_facts_stage RENAME TO data_facts;
COMMIT;
Run Code Online (Sandbox Code Playgroud)
此操作的问题在于,长时间运行的分析查询会将 AccessShareLock 放在 上public.data_facts,以防止它被删除并破坏我们的 ETL 周期。我认为更好的解决方案是重命名现有表,如下所示:
ALTER TABLE public.data_facts RENAME TO data_facts_old;
ALTER TABLE public.data_facts_stage RENAME TO data_facts;
DROP TABLE public.data_facts_old;
Run Code Online (Sandbox Code Playgroud)
但是,这种方法的前提是 1)public.data_facts 存在,2)public.data_facts_old 不存在。
您知道是否有一种方法可以在 SQL 中安全地执行此操作,而不依赖于应用程序逻辑?(例如,像 ALTER TABLE IF EXISTS 这样的东西)。