SQL Server への拡張ストアド プロシージャの追加
重要 |
---|
この機能は、Microsoft SQL Server の将来のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。代わりに、CLR 統合を使用してください。 |
拡張ストアド プロシージャ関数を含んでいる DLL は、SQL Server の拡張機能としての役割を果たします。DLL をインストールするには、標準の SQL Server DLL ファイルを含んでいるディレクトリ (既定では C:\Program Files\Microsoft SQL Server\MSSQL10_50.x\MSSQL\Binn) などに、DLL ファイルをコピーします。
SQL Server システム管理者は、拡張ストアド プロシージャ DLL をサーバーにコピーした後、DLL 内の各拡張ストアド プロシージャを SQL Server に登録する必要があります。この操作を行うには、sp_addextendedproc システム ストアド プロシージャを使用します。
セキュリティに関する注意 |
---|
システム管理者は、拡張ストアド プロシージャをサーバーに追加し、他のユーザーに実行権限を許可する前に、拡張ストアド プロシージャに有害なコードや悪意のあるコードが含まれていないことを十分に確認する必要があります。ユーザー入力はすべて検証してください。また、ユーザー入力は検証するまで連結しないでください。検証していないユーザー入力から作成されたコマンドは、絶対に実行しないでください。入力の検証の詳細については、「SQL インジェクション」を参照してください。 |
sp_addextendedproc の最初のパラメーターには、関数の名前を指定します。2 番目のパラメーターには、その関数が含まれている DLL の名前を指定します。このとき、DLL の完全パスを指定することをお勧めします。
重要 |
---|
既存の DLL が、完全パスを使用して登録されていない場合、SQL Server 2005 へのアップグレード後には機能しなくなります。この問題を修正するには、sp_dropextendedproc を使用して DLL の登録を解除し、sp_addextendedproc を使用して完全パスと共に登録し直します。 |
sp_addextendedproc に指定する関数の名前は、大文字と小文字の区別を含め、DLL 内の関数名とまったく同じにする必要があります。たとえば、次のコマンドは xp_hello.dll という名前の dll に含まれている xp_hello 関数を、SQL Server 拡張ストアド プロシージャとして登録します。
sp_addextendedproc 'xp_hello', 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\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
名前と照合順序が DLL 内の関数とまったく同じになるように拡張ストアド プロシージャが登録されていても、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 を停止して再起動する必要はありません。