SQLCMD恢复MSSQL库时执行sp_dropextendedproperty报扩展属性类错误求助
迁移过程中sp_dropextendedproperty执行报错的排查与解决
执行drop扩展属性语句时收到Object is invalid. Extended properties are not permitted on 'my_schema.my_table_name', or the object does not exist.报错,本质是存储过程无法定位到匹配参数的操作对象,或目标对象本身不允许设置扩展属性,可按以下步骤逐一排查:
核心排查步骤
- 核对目标对象的真实存在性
切换到MoodleNew库上下文,执行系统视图查询确认对应架构、表是否存在:
若查询无结果,说明问题根源并非扩展属性本身:要么是导出脚本中表名、架构名存在拼写、大小写不一致的问题,要么是当前执行到drop语句时,对应表的创建脚本还没执行到,脚本执行顺序存在错位。USE [MoodleNew] SELECT * FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = N'my_schema' AND t.name = N'my_table_name' - 排查执行上下文偏差
使用SQLCMD跑批时,要确认USE [MoodleNew]语句实际生效:如果脚本中跨GO块存在其他库的操作,可能导致执行到drop语句时,连接还停留在master等其他数据库下,自然无法找到对应对象。
临时验证时可以在SQLCMD命令里加上-d MoodleNew参数,强制指定连接建立后默认打开的数据库,排除上下文切换失效的干扰。 - 确认目标扩展属性是否真实存在
就算目标表真实存在,如果你要删除的MS_SSMA_SOURCE扩展属性根本没绑定在这张表上,sp_dropextendedproperty也会抛出通用报错,不会专门区分是对象不存在、还是属性不存在。可以通过系统视图查询表上绑定的所有扩展属性:
如果查询结果中没有SELECT * FROM sys.extended_properties ep JOIN sys.tables t ON ep.major_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = N'my_schema' AND t.name = N'my_table_name'MS_SSMA_SOURCE项,说明这条drop语句本身是冗余的,没有执行必要。
可落地的解决方法
- 给所有drop扩展属性的语句加存在性判断,确认对象和属性都存在再执行,避免报错中断整个脚本流程,参考逻辑:
IF EXISTS ( SELECT 1 FROM sys.extended_properties ep JOIN sys.tables t ON ep.major_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE ep.name = N'MS_SSMA_SOURCE' AND s.name = N'my_schema' AND t.name = N'my_table_name' ) EXEC sys.sp_dropextendedproperty @name=N'MS_SSMA_SOURCE', @level0type=N'SCHEMA', @level0name=N'my_schema', @level1type=N'TABLE', @level1name=N'my_table_name' - 如果脚本是通过SSMA(SQL Server Migration Assistant)导出的,这类sp_dropextendedproperty语句属于工具自带的残留清理逻辑,本身对数据库的正常运行没有任何影响,完全可以直接从迁移脚本中批量删除,跳过无效的清理步骤。
内容的提问来源于stack exchange,提问作者Sumeet Masih
相关产品推荐
相关产品推荐

