使用可驗證的組件搭配 SQL Server (C++/CLI)
封裝為動態連結程式庫 (DLL) 的延伸預存程序,會透過使用 Visual C++ 開發的函式來提供擴充的 SQL Server 功能。 延伸預存程序會實作為 DLL 內的函式。 除了函式以外,延伸預存程序還可以定義使用者定義型別和彙總函式 (例如 SUM 和 AVG)。
當用戶端執行了延伸預存程序時,SQL Server 會搜尋與延伸預存程序有關的 DLL 並載入 DLL。 SQL Server 會呼叫要求的延伸預存程序,並在指定的安全性內容中執行它。 然後延伸預存程序會傳遞結果集,並將參數傳回至伺服器。
SQL Server 2005 提供了 Transact-SQL (T-SQL) 的擴充部分,讓您能把可驗證的組件安裝至 SQL Server。 SQL Server 使用權限集合會以下列的安全性層級來指定安全性內容:
不受限制模式:您必須自行承擔執行程式碼的風險,因為程式碼沒有經過型別安全的驗證。
安全模式:執行可驗證的型別安全程式碼,使用 /clr:safe 編譯。
安全模式要求所執行的組件必須通過型別安全的驗證。
若要建立可驗證的組件並將它載入 SQL Server,請使用 Transact-SQL 命令 CREATE ASSEMBLY 和 DROP ASSEMBLY,如下所示:
CREATE ASSEMBLY <assemblyName> FROM <'Assembly UNC Path'> WITH
PERMISSION_SET <permissions>
DROP ASSEMBLY <assemblyName>
PERMISSION_SET 命令會指定安全性內容,並可以擁有 UNRESTRICTED、SAFE 或 EXTENDED 值。
此外,您可以使用 CREATE FUNCTION 命令,繫結至類別中的方法名稱:
CREATE FUNCTION <FunctionName>(<FunctionParams>)
RETURNS returnType
[EXTERNAL NAME <AssemblyName>:<ClassName>::<StaticMethodName>]
範例
下列 SQL 指令碼 (例如,名為 "MyScript.sql") 會載入組件至 SQL Server,並且能夠讓您使用類別的方法:
-- Create assembly without external access
drop assembly stockNoEA
go
create assembly stockNoEA
from
'c:\stockNoEA.dll'
with permission_set safe
-- Create function on assembly with no external access
drop function GetQuoteNoEA
go
create function GetQuoteNoEA(@sym nvarchar(10))
returns real
external name stockNoEA:StockQuotes::GetQuote
go
-- To call the function
select dbo.GetQuoteNoEA('MSFT')
go
SQL 指令碼可以在 SQL Query Analyzer 中以互動的方式執行,或是在命令列搭配 sqlcmd.exe 公用程式使用。 下列命令列會連接至 MyServer、使用預設資料庫和信任的連接、並且輸入 MyScript.sql 和輸出 MyResult.txt。
sqlcmd –S MyServer -E –i myScript.sql –o myResult.txt