DBT快照执行报错:数据库已存在table_name__dbt_tmp对象
解决DBT快照重复运行时
table_name__dbt_tmp已存在的报错 问题背景
首次执行dbt snapshot正常,再次运行时触发SQL Server报错:
('42S01', "[42S01] [Microsoft][ODBC Driver 18 for SQL Server][SQL Server]There is already an object named 'table_name__dbt_tmp' in the database. (2714) (SQLMoreResults)")
数据库中找不到带__dbt_tmp后缀的表,但报错提示该对象已存在。
原因分析
__dbt_tmp是dbt执行快照时自动创建的临时中间表,用于对比源表与快照表的变更数据,正常执行完成后会自动清理。出现这个问题通常是以下场景:
- 上一次快照执行被异常中断(比如手动终止、连接断开),dbt未完成临时表的清理步骤
- 临时表是会话级本地临时表(前缀带
#),仅创建它的数据库会话可见,你当前查询用的是不同会话,所以看不到 - dbt-sqlserver适配器的旧版本存在临时表清理逻辑的bug
解决方案
1. 手动清理残留对象
执行以下SQL查询数据库中是否存在该临时表(包含会话级和全局级):
-- 查找所有包含目标后缀的对象 SELECT name, type_desc FROM sys.objects WHERE name LIKE '%table_name__dbt_tmp%' UNION ALL SELECT name, 'LOCAL_TEMP_TABLE' FROM tempdb.sys.tables WHERE name LIKE '%table_name__dbt_tmp%'
如果查询到结果,执行删除命令:
DROP TABLE IF EXISTS [table_name__dbt_tmp]; -- 如果是临时表,用下面的命令 DROP TABLE IF EXISTS #table_name__dbt_tmp; DROP TABLE IF EXISTS ##table_name__dbt_tmp;
2. 检查快照执行的中断场景
确认上一次快照执行是否被意外终止:
- 查看dbt的执行日志,确认是否有中途报错、连接断开的记录
- 后续执行快照时尽量避免手动中断,确保流程完整执行
3. 升级dbt-sqlserver适配器
如果使用的是旧版本的dbt-sqlserver插件,可能存在临时表清理的逻辑缺陷,升级到最新版本:
pip install --upgrade dbt-sqlserver
4. 验证快照配置
检查你的快照文件(.sql)中的配置是否正确:
- 确认
strategy配置为timestamp或check,且对应的列(updated_at或check_cols)存在且有效 - 确认target schema有足够的权限创建和删除表
内容的提问来源于stack exchange,提问作者SCQs
相关产品推荐
相关产品推荐

