複雑なフィルタリングと操作のために、Linq ベースの CLR ストアド プロシージャに取り組んでいます。それ以外の場合は、より「従来の」ストアド プロシージャで実装すると、面倒でパフォーマンスの低い T-SQL コードが大量に必要になります。
これはうまく機能していますが、モジュール内のデータベースオブジェクトをより適切に編成および分離するために、展開の段階でこのストアドプロシージャのスキーマを設定する方法が見つかりません。
何か案は?
よろしくお願いします。
複雑なフィルタリングと操作のために、Linq ベースの CLR ストアド プロシージャに取り組んでいます。それ以外の場合は、より「従来の」ストアド プロシージャで実装すると、面倒でパフォーマンスの低い T-SQL コードが大量に必要になります。
これはうまく機能していますが、モジュール内のデータベースオブジェクトをより適切に編成および分離するために、展開の段階でこのストアドプロシージャのスキーマを設定する方法が見つかりません。
何か案は?
よろしくお願いします。
更新: Visual Studio 2012 では、「SQL Server データベース プロジェクト」のプロジェクト プロパティ ウィンドウからこれを実行できるようになりました。関連するプロパティは、[プロジェクト設定] タブの [既定のスキーマ] です。この値を変更すると、生成された配置スクリプトが変更され、関数、ストアド プロシージャなどの前にスキーマ名が配置されます。同じ名前のスキーマ オブジェクトをプロジェクトに必ず追加してください。そうしないと、ビルド エラーが発生します。
使用している Visual Studio のバージョンはわかりませんが、Visual Studio 2010 で CLR ストアド プロシージャ プロジェクトを作成すると、プロジェクトには PreDeploymentScript.sql と PostDeploymentScript.sql の 2 つの SQL スクリプトが含まれます。
これらを使用して、好きなように操作します。
デプロイ前スクリプトには、次のようなものがあります。
-- DROP EXISTING ITEM FROM CURRENT SCHEMA
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Utilities].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [Utilities].[fn_Create_Md5_Hash]
GO
次に、デプロイ後のスクリプトでは、次のようになります。
-- DEPLOYMENT WIZARD RECREATES ITEM IN dbo SCHEMA
-- DROP NEW ITEM FROM dbo SCHEMA
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_Create_Md5_Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fn_Create_Md5_Hash]
GO
-- RECREATE THE ITEM BACK IN THE SCHEMA YOU WANT
CREATE FUNCTION [Utilities].[fn_Create_Md5_Hash](@source [varbinary](max))
RETURNS [varbinary](8000) WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [NameSpace].[UserDefinedFunctions].[fn_Create_Md5_Hash]
GO
それが役立つことを願っています!
アセンブリを参照するプロシージャを作成すると、任意のスキーマが所有するこのラッパーを作成できます。ストアドプロシージャをデプロイする方法のウォークスルーについては、CLRストアドプロシージャのデプロイに関するこのMSDNの記事を参照してください。createprocedureステートメントを次のようなものに変更します。
CREATE SCHEMA foo
CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
foo
これで、スキーマが所有するプロシージャを持つことができます。