删除程序集

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

DROP ASSEMBLY MyDotNETAssembly

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

如果程序集被存在于该数据库中的另一个程序集引用,或者它被当前数据库中的公共语言运行时 (CLR) 函数、过程、触发器、用户定义类型 (UDT) 或用户定义聚合 (UDA) 使用,则 DROP ASSEMBLY 返回错误。首先可使用 DROP AGGREGATE、DROP FUNCTION、DROP PROCEDURE、DROP TRIGGER 和 DROP TYPE 语句删除该程序集中所包含的所有托管数据库对象。

从数据库中删除 UDT

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

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

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

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

查找 UDT 依赖关系

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

USE Adventureworks;
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
  JOIN sys.objects AS o
    ON o.object_id = c.object_id
  JOIN sys.assembly_types AS at
    ON at.user_type_id = c.user_type_id;