<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=SQL_CLR</id>
	<title>SQL CLR - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=SQL_CLR"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=SQL_CLR&amp;action=history"/>
	<updated>2026-06-24T20:22:31Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=SQL_CLR&amp;diff=459191&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot：​补救3个来源，并将0个来源标记为失效。) #IABot (v2.0.7</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=SQL_CLR&amp;diff=459191&amp;oldid=prev"/>
		<updated>2020-09-26T21:50:56Z</updated>

		<summary type="html">&lt;p&gt;补救3个来源，并将0个来源标记为失效。) #IABot (v2.0.7&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{noteTA|G1=IT}}&lt;br /&gt;
[[File:SQL CLR.png|right|320px]]&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;SQL CLR&amp;#039;&amp;#039;&amp;#039; (SQL Common Language Runtime) 是自 SQL Server 2005 才出現的新功能，它將[[.NET Framework]]中的[[Common Language Runtime|CLR]]服務注入到 SQL Server 中，讓 SQL Server 的部份資料庫物件可以使用 .NET Framework 的程式語言開發（目前只支援[[VB.NET]]和[[C♯|C#]]），包括[[存储程序|預存程序]]、[[使用者自訂函數]]、[[触发器 (数据库)|觸發程序]]、[[使用者自訂型別]]以及[[使用者自訂彙總函數]]等功能&amp;lt;ref&amp;gt;{{Cite web |url=http://msdn.microsoft.com/zh-tw/library/ms254498.aspx |title=SQL Server CLR 整合簡介 |accessdate=2008-10-15 |archive-date=2009-06-27 |archive-url=https://web.archive.org/web/20090627172915/http://msdn.microsoft.com/zh-tw/library/ms254498.aspx |dead-url=no }}&amp;lt;/ref&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
== 架構 ==&lt;br /&gt;
&lt;br /&gt;
SQL CLR 是利用 .NET Framework 中的 &amp;#039;&amp;#039;&amp;#039;Hosting（裝載）&amp;#039;&amp;#039;&amp;#039; 特性所實作的版本，這個功能讓 SQL Server 中可以安裝 .NET Framework 的[[.NET assembly|組件]]，經由實作 ADO.NET 2.0 中所開放的 &amp;lt;code&amp;gt;Microsoft.SqlServer.Server&amp;lt;/code&amp;gt; 命名空間中的[[.NET metadata|.NET中介資料]]，來獲得 SQL Server 資料庫物件的能力：&lt;br /&gt;
&lt;br /&gt;
* 預存程序：&amp;lt;code&amp;gt;SqlProcedureAttribute&amp;lt;/code&amp;gt;。&lt;br /&gt;
* 使用者函數：&amp;lt;code&amp;gt;SqlFunctionAttribute&amp;lt;/code&amp;gt;。&lt;br /&gt;
* 觸發程序：&amp;lt;code&amp;gt;SqlTriggerAttribute&amp;lt;/code&amp;gt;。&lt;br /&gt;
* 使用者自訂彙總：&amp;lt;code&amp;gt;SqlUserDefinedAggregate&amp;lt;/code&amp;gt;。&lt;br /&gt;
* 使用者自訂型別：&amp;lt;code&amp;gt;SqlUserDefinedType&amp;lt;/code&amp;gt;。&lt;br /&gt;
&lt;br /&gt;
SQL CLR 的組件在發展完成後，需要使用 &amp;lt;code&amp;gt;CREATE ASSEMBLY&amp;lt;/code&amp;gt; 指令將組件安裝到 SQL Server 中，然後使用相對應的 DDL 指令將組件中開放的函數引入資料庫物件中，才能在 SQL 指令中叫用。&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE ASSEMBLY SQLCLRTest&lt;br /&gt;
FROM &amp;#039;C:\MyDBApp\SQLCLRTest.dll&amp;#039;&lt;br /&gt;
WITH PERMISSION_SET = SAFE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 安全性 ==&lt;br /&gt;
&lt;br /&gt;
對於 SQL Server 來說，SQL CLR 組件是一種外部程式碼，所以在 SQL Server 預設的安裝組態中，SQL CLR 是被封鎖不可以使用的，若要使用它，必須要先將它打開&amp;lt;ref&amp;gt;{{Cite web |url=http://msdn.microsoft.com/zh-tw/library/ms131048(SQL.90).aspx |title=Database Engine .NET Programming - Enabling CLR Integration |accessdate=2008-10-15 |archive-date=2009-06-27 |archive-url=https://web.archive.org/web/20090627181639/http://msdn.microsoft.com/zh-tw/library/ms131048(SQL.90).aspx |dead-url=no }}&amp;lt;/ref&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
EXEC sp_configure &amp;#039;clr enabled&amp;#039;, 1;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
而對於 SQL CLR 組件本身，SQL Server 也做了三重的防護&amp;lt;ref&amp;gt;{{Cite web |url=http://msdn.microsoft.com/zh-tw/library/ms345106(SQL.90).aspx |title=Database Engine .NET Programming - Creating an Assembly |accessdate=2008-10-15 |archive-date=2009-06-27 |archive-url=https://web.archive.org/web/20090627181639/http://msdn.microsoft.com/zh-tw/library/ms345106(SQL.90).aspx |dead-url=no }}&amp;lt;/ref&amp;gt;：&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;SAFE&amp;#039;&amp;#039;&amp;#039;：只有最少的權限可以執行，不可存取外部資源與外部程式碼。&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;EXTERNAL_ACCESS&amp;#039;&amp;#039;&amp;#039;：可以存取外部資源，像是檔案、登錄資料庫、網路資源等。&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;UNSAFE&amp;#039;&amp;#039;&amp;#039;：可以無限制的存取外部資源，連 Win32 API 等都可以呼叫。&lt;br /&gt;
&lt;br /&gt;
在大多數的情況來說，使用 SAFE 即可以正常使用組件，除非是要存取外部檔案才使用 EXTERNAL_ACCESS，只有在特殊的情況下（例如要呼叫外部的商業邏輯元件）時，才會啟用 UNSAFE 層次。&lt;br /&gt;
&lt;br /&gt;
== 範例 ==&lt;br /&gt;
&lt;br /&gt;
下列範例為使用 C# 開發 SQL Server 使用者函數的程式碼：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
[Microsoft.SqlServer.Server.SqlFunction]&lt;br /&gt;
public static SqlString HashPasswordString(SqlString HashString)&lt;br /&gt;
{&lt;br /&gt;
    SHA384Managed hashAlgorithm = new SHA384Managed();&lt;br /&gt;
    byte[] srcPassword = System.Text.Encoding.ASCII.GetBytes(HashString.Value);&lt;br /&gt;
    byte[] destPassword = null;&lt;br /&gt;
    string hashedPasswordString = null;&lt;br /&gt;
&lt;br /&gt;
    destPassword = hashAlgorithm.ComputeHash(srcPassword);&lt;br /&gt;
    hashedPasswordString = System.Text.Encoding.ASCII.GetString(destPassword);&lt;br /&gt;
&lt;br /&gt;
    hashAlgorithm = null;&lt;br /&gt;
    return new SqlString(hashedPasswordString);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
將組件安裝到 SQL Server 的指令碼為：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE ASSEMBLY MyAssemblyLibrary FROM &amp;#039;MySQLCLR.dll&amp;#039; WITH PERMISSION_SET = SAFE&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
將此函數引入 SQL Server 中的 DDL 指令碼為：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE FUNCTION dbo.HashPassword&lt;br /&gt;
(&lt;br /&gt;
   @PasswordString varchar(4000)&lt;br /&gt;
)&lt;br /&gt;
RETURNS varchar(4000)&lt;br /&gt;
EXTERNAL NAME [MyAssemblyLibrary]。[MySQLCLR]。[HashPasswordString]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
安裝並引入後，即可如一般的 SQL 函數方式使用：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
SELECT dbo.HashPassword(&amp;#039;mypassword&amp;#039;) -- 回傳 mypassword 被雜湊後的值。&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 參考資料 ==&lt;br /&gt;
&amp;lt;div class=&amp;quot;references-small&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
{{Microsoft development tools}}&lt;br /&gt;
{{DotNET}}&lt;br /&gt;
&lt;br /&gt;
[[Category:SQL Server]]&lt;br /&gt;
[[Category:.NET]]&lt;br /&gt;
[[Category:資料庫]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>