将Visual Studio数据库项目对象部署到除“ dbo”之外的其他模式中

问题描述 投票:1回答:2

我有以下情况。

我在Visual Studio数据库项目中有一个SQLCLR存储过程。这不应在dbo模式中,而应在foo中。如我所见,在使用Visual Studio发布功能时,不可能为SQLCLR存储过程提供不同的架构。

所以我必须把它包起来。现在我有两个脚本。

添加一个程序集:

CREATE ASSEMBLY [MyAssembly]
FROM 'MyAssembly.dll';
GO

另外一个将存储过程添加到数据库中:

CREATE PROCEDURE [foo].[MyProc](@param NVARCHAR(10))
    AS EXTERNAL NAME MyAssembly.ClassName.MyProc
GO

但是由于未解析的对MyAssembly的引用,现在出现错误。我认为这是因为所有内容(SQLCLR proc,T-SQL包装器proc,程序集添加脚本)都在同一项目中,并且是对自身的引用。

在我自己的模式下在数据库中部署SQLCLR存储过程的最佳方法是什么?如果可以直接将其添加到SQLCLR实现中,那就太好了。

提前感谢。

sql-server tsql deployment sql-server-data-tools sqlclr
2个回答
1
投票

实际上,这可能不是问题。应该有一个选项来设置T-SQL包装对象的模式:https://stackoverflow.com/a/32273788/577765

如果您使用的Visual Studio / SSDT版本没有设置架构的选项,那么您应该能够简单地添加一个T-SQL部署后脚本,将对象移动到所需的架构。通过添加T-SQL脚本并将属性设置为“部署后”(或类似的内容),它将被插入到生成的发布脚本的末尾。

如果只是少数对象,实际上并没有引入新对象,则可以为每个对象做明确的声明:

ALTER SCHEMA [foo] TRANSFER [dbo].[MyProc];

如果是大量对象,并且/或者偶尔会添加新对象,并且您不想记住将它们添加到此部署后包含脚本中,可以循环浏览关联的对象列表与该程序集一起创建一个动态SQL脚本,该程序可以将它们全部移动,而无需对程序集名称进行硬编码(从技术上讲,甚至可以使用MSBuild / SSDT变量进行动态处理):

DECLARE @SQL NVARCHAR(MAX) = N'';

SELECT @SQL += N'ALTER SCHEMA [foo] TRANSFER [dbo].'
               + QUOTENAME(obj.[name]) + N';' + NCHAR(0x0D) + NCHAR(0x0A)
FROM   sys.assembly_modules amd
INNER JOIN sys.assemblies asm
        ON asm.[assembly_id] = amd.[assembly_id]
INNER JOIN sys.objects obj
        ON obj.[object_id] = amd.[object_id]
WHERE  asm.[name] = N'Company.Area.Technology.ProjectName' -- do not use [ and ] here
AND    SCHEMA_NAME(obj.[schema_id]) = N'dbo'

PRINT @SQL; -- DEBUG (else, comment out)

EXEC (@SQL);

0
投票

我可以自己解决它。只是一个非常愚蠢的错误...

我的程序集的名称具有模式Company.Area.Technology.ProjectName。如果我尝试使用此方法创建存储过程,则会发生错误,提示需要一个点。

CREATE PROCEDURE [foo].[MyProc](@param NVARCHAR(10))
    AS EXTERNAL NAME Company.Area.Technology.ProjectName.ClassName.MyProc
GO

解决方案是在[]之间设置程序集名称。

CREATE PROCEDURE [foo].[MyProc](@param NVARCHAR(10))
    AS EXTERNAL NAME [Company.Area.Technology.ProjectName].ClassName.MyProc
GO

这有效。因此,我可以将CLR过程包装到我自己的模式中。

© www.soinside.com 2019 - 2024. All rights reserved.