删除程序集

适用范围:SQL Server

当不再需要它们提供的功能时,可以使用 CREATE ASSEMBLY 语句在 SQL Server 中注册的程序集被删除或删除。 删除程序集时,将从数据库中删除程序集和它的所有关联文件,如调试文件。 若要删除程序集,请使用具有以下语法的 DROP ASSEMBLY 语句:

DROP ASSEMBLY MyDotNETAssembly;

DROP ASSEMBLY 不会干扰引用当前正在运行的程序集的任何代码,但在执行 DROP ASSEMBLY 后,任何调用程序集代码的尝试都会失败。

如果程序集由数据库中存在的另一个程序集引用,或者公共语言运行时(CLR)函数、过程、触发器、用户定义的类型(UDT)或当前数据库中的用户定义聚合(UDA)使用,则 DROP ASSEMBLY 返回错误。 首先使用 DROP AGGREGATEDROP FUNCTIONDROP PROCEDUREDROP TRIGGERDROP TYPE 语句删除程序集中包含的任何托管数据库对象。

从数据库中删除 UDT

DROP TYPE 语句从当前数据库中删除 UDT。 删除 UDT 后,可以使用 DROP ASSEMBLY 语句从数据库中删除程序集。

如果对象依赖于 UDT,DROP TYPE 语句将失败,如以下情况所示:

  • 数据库中的表包含使用 UDT 定义的列。

  • 使用 WITH SCHEMABINDING 子句在数据库中创建的 UDT 变量或参数的函数、存储过程或触发器。

查找 UDT 依赖项

必须先删除所有依赖对象,然后执行 DROP TYPE 语句。 以下 Transact-SQL 查询查找 AdventureWorks2022 数据库中使用 UDT 的所有列和参数。

USE Adventureworks2022;
GO

SELECT o.name AS major_name,
       o.type_desc AS major_type_desc,
       c.name AS minor_name,
       c.type_desc AS minor_type_desc,
       at.assembly_class
FROM (SELECT object_id,
             name,
             user_type_id,
             'SQL_COLUMN' AS type_desc
      FROM sys.columns
      UNION ALL
      SELECT object_id,
             name,
             user_type_id,
             'SQL_PROCEDURE_PARAMETER'
      FROM sys.parameters) AS c
     INNER JOIN sys.objects AS o
         ON o.object_id = c.object_id
     INNER JOIN sys.assembly_types AS at
         ON at.user_type_id = c.user_type_id;