在SqlUserDefinedTypeAttribute中设置模式名称

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

为了SQLCLR集成而在C#代码中创建UserDefinedType时,需要使用SqlUserDefinedType为类或结构添加前缀,例如:

[SqlUserDefinedType(
    Name = "g.Options",
    // ...
)]
public struct Options : INullable {
    // ...
}

请注意,在“Name”参数中,除了对象名称之外,我还尝试设置模式。但是,当我在Visual Studio数据库项目的发布阶段生成脚本时,我得到:

CREATE TYPE [dbo].[g.Options]

SqlUserDefinedType没有“schema”参数。

我相信我可以编写T-SQL脚本来专门从程序集中创建类型,但我想避免这种情况,因为我计划将大多数类型放在不同的模式中,并且不愿意注册通过显式TSQL对每一个。


编辑:

正如Solomon Rutzky所指出的,您可以在项目属性中设置默认架构。它肯定不能替代类似于SqlUserDefinedType中的'schema'参数的东西,特别是如果你想使用多个模式,但它确实可以满足许多人的需求。

部署后脚本在技术上可以完成工作,但遗憾的是,比较引擎不了解部署后的逻辑,因此将永久地将架构差异注册为需要更改的内容。因此,无论您是否更改了所有受影响的对象,都会在每次发布时删除并重新创建。

sql-server database-schema sqlclr user-defined-types
1个回答
1
投票

模式名称在每个项目的单个位置指定,而不是按对象指定。

您可以通过以下方式在Visual Studio中进行设置:

“项目”(菜单) - >“{project_name}属性...”(菜单选项) - >“项目设置”(选项卡)

在右侧的“常规”部分中,有一个“默认架构:”的文本字段

要么:

您可以手动编辑{project_name} .sqlproj文件,并在其中一个顶级<PropertyGroup>元素(一个没有“Condition”属性;通常使用第一个这样的元素),您可以创建(或更新,如果它已经存在)以下元素:

<DefaultSchema>dbo</DefaultSchema>

但是,如果您希望将一个对象(例如UDT)设置为与其他对象正在使用的其他Schema名称,则必须在Post Release SQL脚本中手动完成。您可以向项目添加SQL脚本,然后在右侧的解决方案资源管理器中,选择SQL脚本,转到其属性,对于“BuildAction”,选择“PostDeploy”。在该部署后脚本中,发出ALTER SCHEMA语句:

ALTER SCHEMA [g] TRANSFER TYPE::dbo.Options; 
© www.soinside.com 2019 - 2024. All rights reserved.