SQL Azure运行Update查询报错:无效对象名'DataSync.provision_marker_dss'
问题根因
该报错是Azure SQL数据同步的残留对象导致的:
你删除同步组、同步代理后,原数据库中数据同步为业务表自动生成的DML触发器、存储过程没有被同步清理;如果你是通过导入旧库结构的方式重建新库,这些残留的触发器会随表结构一起被导入到新库。
当你执行UPDATE操作时,触发了对应表残留的finstock06_dss_update_trigger更新触发器,触发器内部依赖的DataSync.provision_marker_dss同步系统表已经被清理,因此抛出对象不存在的错误。
解决步骤
- 第一步:先查询当前库中所有残留的同步相关触发器,确认残留对象范围,运行如下SQL:
SELECT name AS trigger_name, OBJECT_NAME(parent_id) AS associated_table_name FROM sys.triggers WHERE name LIKE '%_dss_%_trigger'
- 第二步:确认查询结果中的触发器均为同步自动生成(名称带
_dss_标识的均为Azure数据同步系统生成对象,非用户自定义的话可直接删除),执行批量删除脚本:
DECLARE @TriggerName NVARCHAR(MAX) DECLARE TriggerCursor CURSOR FOR SELECT name FROM sys.triggers WHERE name LIKE '%_dss_%_trigger' OPEN TriggerCursor FETCH NEXT FROM TriggerCursor INTO @TriggerName WHILE @@FETCH_STATUS = 0 BEGIN EXEC('DROP TRIGGER ' + @TriggerName) FETCH NEXT FROM TriggerCursor INTO @TriggerName END CLOSE TriggerCursor DEALLOCATE TriggerCursor
- 第三步(可选):如果后续不会再使用Azure SQL数据同步功能,可同步清理残留的同步存储过程和空架构:
-- 清理同步生成的dss前缀存储过程 DECLARE @ProcName NVARCHAR(MAX) DECLARE ProcCursor CURSOR FOR SELECT name FROM sys.procedures WHERE name LIKE '%_dss_%' OPEN ProcCursor FETCH NEXT FROM ProcCursor INTO @ProcName WHILE @@FETCH_STATUS = 0 BEGIN EXEC('DROP PROCEDURE ' + @ProcName) FETCH NEXT FROM ProcCursor INTO @ProcName END CLOSE ProcCursor DEALLOCATE ProcCursor -- 确认DataSync架构下无自定义对象后删除架构 IF EXISTS (SELECT * FROM sys.schemas WHERE name = 'DataSync') DROP SCHEMA DataSync
验证
操作完成后重新执行之前报错的UPDATE语句,即可正常运行。
内容的提问来源于stack exchange,提问作者Taha Waseem
相关产品推荐
相关产品推荐

