技术开发 频道

SQL Server 2005中的CLR集成


    CREATE ASSEMBLY语句将程序集加载到SQL Server中,此时可以在SQL Server内部引用该程序集。在SQL Server中,可以以相同文件名称存储程序集的多个版本,只要每个.dll文件具有不同的版本号。

    需要注意的一件事情是CREATE ASSEMBLY语句是以WITH PERMISSION_SET子句结尾。该子句设置了当SQL Server使用和访问程序集时,对程序集的访问权限。该子句的可用值是:

    SAFE:这是默认级别,具有最大限制性。这意味着,代码不需要使用任何外部资源,在SQL Server内部可以完全控制操作。SAFE代码能够访问本地SQL Server数据库中的数据,或者执行计算,以及处理不包括访问本地数据库之外资源的业务逻辑。阶乘计算是一个好例子。阶乘计算只需要整型输入,然后返回另外一个整数。计算阶乘无需打开磁盘上的文件。

    EXTERNAL_ACCESS:该级别表示可以使用某些外部资源,例如文件、网络、Web服务、环境变量和注册表。因此,如果代码计划将某些结果写入磁盘文件中,那么需要在SQL Server的EXTERNAL_ACCESS安全类别下注册这些代码。

    UNSAFE:这个级别设置代码能够完成任何事情,因此应该尽量避免使用。换言之,开发人员要求不做任何级别的控制,因此代码与外部存储过程具有相同权限。即使获得了与外部存储过程相同的权限,CLR仍然会为开发人员代码一些方便。然而,这样在逻辑上可能存在漏洞,那么黑客就能够随意访问系统的关键部分。因此,应该避免在SQL Server中使用UNSAFE代码。

    本示例代码通过使用HelloWorldStoredProcedures.dll,同时将权限设置为SAFE创建了名为HelloWorld的程序集。
在创建程序集之后,下一步是创建一个使用该程序集的简单T-SQL存储过程。以下DDL语句为程序集创建了入口点:
CREATE PROCEDURE HelloWorld
AS
EXTERNAL NAME HelloWorld.HelloWorldStoredProcedures.HelloWorld
    在执行存储过程之前,查看一下CREATE PROCEDURE语句中的EXTERNAL NAME语法,其设置了.NET程序集的方法,其语法格式如下:
Assembly_name.Class_name.Method_name
    当使用前面的示例时,程序集名称来自CREATE ASSEMBLY,在此处是HelloWorld。第二部分是类名称,其来自HelloWorldStoredProcedures.cs文件代码。第三部分是方法名称,它也来自HelloWorldStoredProcedures.cs,在本示例中是HelloWorld。

    将这些片段信息一起置于EXTERNAL NAME子句,其告知存储过程所执行的内容。 

    此时,可以准备测试程序集和获取返回数据。为了测试示例,通过运行以下语句来执行存储过程:

EXEC HelloWorld
    虽然本示例很简单,但是它说明了创建和部署程序集的基本步骤。下一个示例将在此代码之上,说明涉及访问SQL Server数据的更为复杂的功能。

    读者肯定在想:“必须有一种更为简单的方法来生成和部署这些程序集”。实际上是存在这种方法的。然而,通过这些步骤手动生成和部署程序集的原因是,帮助读者理解程序集生成过程发生的内幕。下面将说明如何使用Visual Studio 2005专业版创建CLR存储过程。

0
相关文章