Sql server 部署期间CLR存储过程的架构

Sql server 部署期间CLR存储过程的架构,sql-server,sqlclr,sql-server-data-tools,Sql Server,Sqlclr,Sql Server Data Tools,我对配置VisualStudio(2010)感兴趣,这样在部署C#CLR数据库项目时,它会将内容放在DBO以外的模式中。我知道我可以更新功能/程序/等。。。它手动创建包装器以实现此目的: 然而,我真的很想以某种方式自动化这个过程。如果有人知道,我会非常感激你的回答 它似乎与安全相关,而且是“设计”完成的 您可以将每个对象的脚本放在部署后脚本中,如下所示。下面的脚本使用schema[Org]重新创建存储过程。希望这有帮助 步骤1-删除由project自动添加的存储过程,因为它是使用默认模式[db

我对配置VisualStudio(2010)感兴趣,这样在部署C#CLR数据库项目时,它会将内容放在DBO以外的模式中。我知道我可以更新功能/程序/等。。。它手动创建包装器以实现此目的:


然而,我真的很想以某种方式自动化这个过程。如果有人知道,我会非常感激你的回答

它似乎与安全相关,而且是“设计”完成的

您可以将每个对象的脚本放在部署后脚本中,如下所示。下面的脚本使用schema[Org]重新创建存储过程。希望这有帮助

步骤1-删除由project自动添加的存储过程,因为它是使用默认模式[dbo]创建的

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[spUpdateCompany]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[spUpdateCompany]
GO
步骤2-删除[Org]模式中已经存在的存储过程,并在[Org]模式中重新创建存储过程

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[Org].[spUpdateCompany]') AND type in (N'P', N'PC'))
DROP PROCEDURE [Org].[spUpdateCompany]
GO



CREATE PROCEDURE [Org].[spUpdateCompany]
    @Id int,
    @Name [nvarchar](4000)
WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [SQLServerProject.CLR].[StoredProcedures].[spUpdateCompany]
GO

您可以使用将存储过程从一个模式更改为另一个模式

ALTER SCHEMA Org TRANSFER dbo.spUdpateCompany

应该提到的是,这个问题在VisualStudio2012中已经过时,它为生成的T-SQL包装器对象提供了一个“默认模式”配置字段。以下答案顶部的“更新”部分也指出了这一点:


在SSDT项目的SQLCLR属性中,可以关闭“生成DDL”。然后,您可以创建自己的附加到CLR程序集的SQL对象。例如,将新存储过程添加为

创建过程[schema]。[StoredProcedure]
@参数BIGINT NULL
作为外部名称[AssemblyNameFromProjectProperties].[ClassWithProcedure].[Method];
转到


这将允许您将不同的对象放在不同的模式中

我说的是,当您在Visual Studio中右键单击SQL CLR项目并单击“部署”时会发生什么情况。它将程序集放在SQL Server中,然后生成调用程序集方法的T-SQL包装函数和存储过程。据我所知,这些包装器总是进入dbo模式。出于组织目的,我想将它们放在一个单独的模式中。到目前为止,我所能管理的最好方法是手动编辑项目中部署前和部署后的SQL脚本,以删除并重新创建我想要的模式中的项目,但这是每个项目的手动过程。整个过程可以简化为一行:ALTER Schema Org TRANSFER dbo.spUdpateCompany。任何与DLL关联的对象都必须在部署之前删除,因为它们依赖于DLL。我原本希望在Visuatl Studio中有一个配置架构的位置,但我从未找到。这是我们采取的方法。。。部署前和部署后脚本。@Griffin
ALTER SCHEMA Org TRANSFER dbo.spUdpateCompany
是很棒的代码。。。我想这一定是最好的答案:)当我运行我的应用程序时,我得到一个部署错误
无法删除该过程,因为它不存在或者您没有权限。删除程序集失败,因为对象引用了该程序集。
。是否有任何选项可以消除此错误?现在这很有帮助。它不基于IDE,但它确实减少了部署后脚本中所需的t-SQL数量!不再拖放和重新创建。它可能不是基于IDE的,但有一个连接项可以投票将其添加为属性(我希望如此)。现在:在项目下的PostDeployScript.sql中添加“alterschema”行,就可以开始部署了。为什么不投票给埃里克?在我看来,这是事实上的答案。@MikeTeeVee不知怎么忘了。这当然是一个更简洁的脚本。我会投票,但在我改变被接受的答案之前,我必须进行测试。此外,我认为我在IDE中找到了一种方法(“项目属性的数据库选项卡上的程序集所有者”),这意味着一旦我提供了我自己的答案,我就会接受它。。。同样,必须首先进行测试。此解决方案的问题在于它不支持被移动的对象被其他对象引用的情况。SSDT模型认为对象在dbo中,因此代码必须引用该对象。然而,当你移动它之后,它就不再存在了。马克·索乌下面的答案是最好的解决方案。