Share via


SQL Server への拡張ストアド プロシージャの追加

ms164653.note(ja-jp,SQL.90).gif重要 :
この機能は、Microsoft SQL Server の将来のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。代わりに、CLR 統合を使用してください。

拡張ストアド プロシージャ関数を含んでいる DLL は、Microsoft SQL Server の拡張機能としての役割を果たします。DLL をインストールするには、標準の SQL Server DLL ファイルを含んでいるディレクトリ (既定では C:\Program Files\Microsoft SQL Server\MSSQL.x\MSSQL\Binn) などに、DLL ファイルをコピーします。

SQL Server システム管理者は、拡張ストアド プロシージャ DLL をサーバーにコピーした後、DDL 内の各拡張ストアド プロシージャを SQL Server に登録する必要があります。この操作を行うには、sp_addextendedproc システム ストアド プロシージャを使用します。

ms164653.security(ja-jp,SQL.90).gifセキュリティ メモ :
システム管理者は、拡張ストアド プロシージャをサーバーに追加し、他のユーザーに実行権限を許可する前に、拡張ストアド プロシージャに有害なコードや悪意のあるコードが含まれていないことを十分に確認する必要があります。ユーザー入力はすべて検証してください。また、ユーザー入力は検証するまで連結しないでください。検証していないユーザー入力から作成されたコマンドは、絶対に実行しないでください。入力の検証の詳細については、「SQL インジェクション」を参照してください。

sp_addextendedproc の最初のパラメータには、関数の名前を指定します。2 番目のパラメータには、その関数が含まれている DLL の名前を指定します。このとき、DLL の完全パスを指定することをお勧めします。

ms164653.note(ja-jp,SQL.90).gif重要 :
既存の DLL が、完全パスを使用して登録されていない場合、SQL Server 2005 へのアップグレード後には機能しなくなります。この問題を解決するには、sp_dropextendedproc を使用してこの DLL の登録を解除してから、sp_addextendedproc で完全パスを指定してこの DLL を再登録します。

sp_addextendedproc に指定する関数の名前は、大文字と小文字の区別を含め、DLL 内の関数名とまったく同じにする必要があります。たとえば、次のコマンドは xp_hello.dll という名前の dll に含まれている xp_hello 関数を、SQL Server 拡張ストアド プロシージャとして登録します。

sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Binn\xp_hello.dll'

sp_addextendedproc に指定した関数の名前が、DLL 内の関数名と正確に一致しない場合、SQL Server に新しい名前が登録されますが、その名前は役に立ちません。次の例で、xp_Hello は xp_hello.dll にある SQL Server 拡張ストアド プロシージャとして登録されますが、後で xp_Hello を使用してこの関数を呼び出しても、SQL Server は DLL 内からこの関数を検出できません。

--Register the function (xp_hello) with an initial upper case
sp_addextendedproc 'xp_Hello', 'c:\xp_hello.dll'

--Use the newly registered name to call the function
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

--This is the error message
Server: Msg 17750, Level 16, State 1, Procedure xp_Hello, Line 1
Could not load the DLL xp_hello.dll, or one of the DLLs it references. Reason: 127(The specified procedure could not be found.).

sp_addextendedproc に指定した関数の名前が DLL 内の関数名とまったく同じであり、SQL Server インスタンスの照合順序で大文字と小文字が区別されない場合、ユーザーは大文字と小文字を任意に組み合わせた名前を使用して、拡張ストアド プロシージャを呼び出すことができます。

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will succeed in calling xp_hello
DECLARE @txt varchar(33)
EXEC xp_Hello @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HelLO @txt OUTPUT

DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

名前と照合順序が DDL 内の関数とまったく同じになるように拡張ストアド プロシージャが登録されていても、SQL Server インスタンスの照合順序で大文字と小文字が区別される場合は、呼び出し時に大文字と小文字を誤ると、SQL Server はこの拡張ストアド プロシージャを呼び出すことができません。

--Register the function (xp_hello)
sp_addextendedproc 'xp_hello', 'c:\xp_hello.dll'

--The following will result in an error
DECLARE @txt varchar(33)
EXEC xp_HELLO @txt OUTPUT

--This is the error
Server: Msg 2812, Level 16, State 62, Line 1

SQL Server を停止して再起動する必要はありません。

参照

その他の技術情報

sp_addextendedproc (Transact-SQL)
sp_dropextendedproc (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手