CLR存储过程:如何设定模式/所有者?
题
我的工作基于LINQ的CLR存储过程对于一些复杂的过滤和操作,否则将需要大量的混乱和高性能差T-SQL代码,如果在一个更“传统”的存储过程实现的。
这是伟大的工作,但我无法找到如何设置这个存储过程的架构中部署的阶段,对数据库对象的模块一个更好的组织和分离。
任何想法?
预先非常感谢。
解决方案
在创建过程引用组件,您可以创建此包装用任何你想要的架构所拥有。请参见这MSDN文章上部署CLR存储过程对于如何做一个演练部署一个存储过程。通过改变CREATE PROCEDURE语句是这样的:
CREATE SCHEMA foo
CREATE PROCEDURE foo.hello
AS
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld
您现在可以通过foo
架构所拥有的过程。
其他提示
更新:在Visual Studio 2012这个现在可以通过项目属性窗口来完成 “SQL Server数据库项目。”相关的属性是“默认模式”的“项目设置”选项卡上。修改此值会修改生成的部署脚本把架构名称中的函数,存储过程等的前...请务必Schema对象添加到您的项目具有相同的名称,否则你会生成错误。
我不知道你使用的是什么版本的Visual Studio,但是当你在Visual Studio 2010中CLR存储过程的项目,该项目包括两个SQL脚本:PreDeploymentScript.sql和PostDeploymentScript.sql
我们只是用它们来maniuplate东西,我们所希望的方式。
在部署前的脚本,我们有这样的事情:
-- 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
希望帮助!
不隶属于 StackOverflow