【问题标题】:Set schema name in SqlUserDefinedTypeAttribute在 SqlUserDefinedTypeAttribute 中设置架构名称
【发布时间】:2019-07-06 16:05:48
【问题描述】:

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

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

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

CREATE TYPE [dbo].[g.Options]

SqlUserDefinedType 没有“模式”参数。

我确实相信我可以编写 T-SQL 脚本来专门从程序集中生成类型,但我想避免这种情况,因为我计划将我的大多数类型放在不同的模式中并且不乐意必须通过显式的 TSQL 在每个上进行注册。


编辑:

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

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

【问题讨论】:

    标签: sql-server database-schema sqlclr user-defined-types


    【解决方案1】:

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

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

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

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

    或者:

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

    <DefaultSchema>dbo</DefaultSchema>
    

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

    ALTER SCHEMA [g] TRANSFER TYPE::dbo.Options; 
    

    【讨论】:

    • 我不认为我会执行部署后路由,因为它会与架构比较混淆。它总是有效的,但它也总是告诉我 clr 对象将需要由于名称差异而更新。我可能会考虑一个具有不同程序集所有者的不同项目。但我不想为每个模式创建一个不同的项目。但至少它允许我为 clr 对象创建一个单独的模式。
    • 我试了一下,但运气不佳。我在问题中提供了我的经验作为编辑。不过感谢您的选择。
    • 我可能复制/粘贴了错误的元素。我回家后会检查的。
    • @pwilcox 是的,我抓错了元素。我已经更新了正确的信息。请再试一次。此外,您是否尝试过发布后脚本选项,或者您只是假设它会被标记为不同?如果您尚未对其进行测试,我可以看到它可能会起作用的情况,因为它需要根据对象到程序集的链接而不是它们的名称来查找对象。因此它可能忽略 UDT 的架构部分。
    • 我目前正在通过默认架构设置进行操作。谢谢你。我将在不久的将来某个时候使用 post deploy 进行测试,并将结果添加到我的问题的编辑部分或我的 cmets。
    猜你喜欢
    • 2015-08-11
    • 1970-01-01
    • 2013-12-07
    • 2018-06-30
    • 2017-03-10
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多