SQL Server 中无效类的原因及解决方法

1. 什么是SQL Server中无效类?

在SQL Server中,无效类指的是在Object Explorer中展示为绿色图标的数据库对象。它们可能是表、视图、存储过程、函数或其他类型的对象,但是它们被认为是无效的,因为它们没有相应的底层对象。这些对象通常是由以下原因导致的:

对象所在的模式已被删除

对象所在的数据库已被删除

对象所依赖的对象已被删除

对象所依赖的数据库已被删除

对象所依赖的服务器已被删除

2. 如何检测无效类?

在SQL Server Management Studio中,可以使用Object Explorer来检测无效类。在Object Explorer中,无效类的图标将显示为绿色。可以展开数据库和对象文件夹,以查看是否存在绿色图标的对象。 另外,也可以使用以下查询来检测无效类:

SELECT name

FROM sys.objects

WHERE is_ms_shipped = 0

AND NOT EXISTS (

SELECT *

FROM sys.schemas

WHERE schemas.schema_id = objects.schema_id)

如果运行上面查询,将输出任何没有与模式相关联的对象的名称。这些对象可以是无效的。

3. 如何修复无效类?

修复无效类的方法可以根据具体情况而定,这取决于为什么对象是无效的。以下是一些常见的策略:

3.1 重新创建依赖项

如果对象是一个视图、存储过程或函数,并且依赖于其他对象,则可以尝试重新创建依赖项。如果依赖项不存在,那么对象就会变为无效的。可以使用以下查询来查找具有不存在依赖项的无效对象:

SELECT name

FROM sys.objects

WHERE is_ms_shipped = 0

AND OBJECTPROPERTY(OBJECT_ID, 'IsValid') = 0

AND NOT EXISTS (

SELECT *

FROM sys.sql_expression_dependencies AS sed

WHERE sed.referencing_id = OBJECT_ID

AND sed.is_ambiguous = 0);

如果运行上述查询,则将输出引用不存在对象的名称。可以使用CREATE语句重新创建这些对象,或者将其恢复到依赖项已存在的先前版本。

3.2 删除无效对象

如果对象是独立的或没有其他对象依赖它,则可以尝试从数据库中删除无效对象。可以使用以下查询来查找无效的独立对象:

SELECT name

FROM sys.objects

WHERE is_ms_shipped = 0

AND OBJECTPROPERTY(OBJECT_ID, 'IsValid') = 0

AND NOT EXISTS (

SELECT *

FROM sys.sql_expression_dependencies AS sed

WHERE sed.referencing_id = OBJECT_ID);

如果运行上述查询,则将输出具有无效依赖项的名称。如果确定对象是无效的且没有其他对象依赖它,则可以从数据库中删除该对象。

3.3 重命名对象

如果对象与删除的模式、数据库或服务器相关联,则可以尝试重命名该对象。可以使用以下查询查找具有删除模式或数据库的无效对象:

SELECT name

FROM sys.objects

WHERE is_ms_shipped = 0

AND OBJECTPROPERTY(OBJECT_ID, 'IsValid') = 0

AND NOT EXISTS (

SELECT *

FROM sys.schemas

WHERE schemas.schema_id = objects.schema_id);

如果运行上述查询,则将输出具有无效模式或数据库的名称。可以使用sp_rename存储过程来重命名这些对象,以将其移到有效的模式或数据库中。

3.4 重启SQL Server服务

如果上述方法都无法解决问题,则可以尝试重新启动SQL Server服务。这可能会减轻一些奇怪的问题,包括无效类。您可以使用以下命令将SQL Server服务重新启动:

net stop MSSQLSERVER

net start MSSQLSERVER

这将停止和启动默认的MSSQLSERVER服务。如果你有多个SQL Server实例,你可以使用其他实例名称代替MSSQLSERVER。

4. 总结

无效类是在SQL Server中常见的问题,可以通过多种方式进行修复。我们可以重建依赖项、删除无效对象、重命名对象以及尝试重新启动SQL Server服务。通过这样做,我们可以保持SQL Server的健康状态,并确保数据库对象的一致性和完整性。

数据库标签