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>]
使用例
次の (たとえば、"MyScript.sql" という名前の) 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 クエリ アナライザーで対話形式で実行するか、コマンド ラインで sqlcmd.exe ユーティリティを使用して実行できます。次のコマンド ラインでは、MyServer に接続し、既定のデータベースを使用します。その後、信頼されている接続を使用して、MyScript.sql を入力し、MyResult.txt を出力します。
sqlcmd –S MyServer -E –i myScript.sql –o myResult.txt