同服务器跨库复制数据提示Invalid object name错误如何解决
跨库插入报Invalid Object Name错误排查方案
按以下优先级逐一排查即可解决问题:
- 优先核对表名拼写:当前语句中目标表名为
tbl_Training_Attempt_New(Attempt为单数形式),源表写为tbl_Training_Attempts_New(Attempts为复数形式),这类单复数笔误是该报错的最高频诱因,先登录BS_Copy库确认源表的准确命名,排查是否存在多字、漏字、拼写错误。 - 补全跨库对象的完整引用路径:SQL Server跨库访问对象的标准三段式格式为
[数据库名].[架构名].[表名],当前语句省略了架构名,系统会默认使用当前连接账号的默认架构查找表,若源表不属于该架构就会触发对象无效报错。通用场景下默认架构为dbo,将源表引用修改为BS_Copy.dbo.tbl_Training_Attempts_New即可,目标表也建议同步补全架构名,写为BS_Database.dbo.tbl_Training_Attempt_New规避同类问题。 - 校验账号权限:确认执行该语句的数据库账号,对BS_Copy库及对应的源表持有SELECT权限,对目标库目标表持有INSERT权限,部分权限不足场景不会直接抛出权限异常,会返回对象名无效的报错。
- 校验源库状态:确认BS_Copy库处于正常在线状态,未处于还原、离线、可疑等不可用状态,可单独执行
SELECT TOP 1 * FROM BS_Copy.sys.tables验证库的可访问性。
修正后参考语句
执行前建议先注释掉INSERT行,单独运行SELECT部分确认能正常返回预期数据,再执行全量插入:
INSERT INTO BS_Database.dbo.tbl_Training_Attempt_New ( [AttemptId], [RequirementId], [EmployeeCompanyId], [TaskId], [CourseId], [RecordId], [StartDate], [Score], [IsComplete], [CompleteDate], [IsPassed], [Active], [TimeInSession] ) SELECT [AttemptId], [RequirementId], [EmployeeCompanyId], [TaskId], [CourseId], [RecordId], [StartDate], [Score], [IsComplete], [CompleteDate], [IsPassed], [Active], [TimeInSession] FROM BS_Copy.dbo.tbl_Training_Attempts_New WHERE IsPassed = 0
内容的提问来源于stack exchange,提问作者Rani Radcliff
相关产品推荐
相关产品推荐

