UDB-TDS互操作性指南
UDB-TDS 旨在通过 TDS 端口通过 T-SQL 语句在 UDBTX之上提供 T-SQL 语义。UDB-TDS 数据库也可以通过带有UDBTX SQL语句的标准 UDBTX 端口访问。当 UDBTX 语句或 UDBTX 访问发生在 UDB-TDS 的上下文中时,UDBTX 和 UDB-TDS 之间可能会发生干扰,从而可能影响语法、语义以及与 UDB-TDS 未来版本的兼容性。如果发生此类情况,UDB-TDS 用户应注意与架构名称、标识符、权限、事务语义、多个结果集、默认排序规则和将来的 UDB-TDS 升级相关的潜在问题。
UDB-TDS/UDBTX 互操作性
UDB-TDS for UDBTX 提供了两个端点,通过这些端点可以访问 UDB-TDS 数据库:TDS 端口(默认值:1433)提供具有 T-SQL 语法和 T-SQL 语义的 T-SQL 接口,以及 UDBTX 端口(默认值:5678)提供具有 UDBTX SQL 语法和语义的 UDBTX 接口。
术语说明:在本文档中,TDS 和 T-SQL 以及 UDBTX 和 UDBTX SQL 用作 SQL 语句类型以及与数据库的相应连接的同义词。
在本文档的上下文中,UDB-TDS 数据库是一个 UDBTX 数据库,用于模拟 T-SQL 语句中的 SQL Server 多数据库环境,例如,它承载着系统数据库(如 master 和 tempdb)以及一个或多个用户数据库。默认情况下,此数据库名为UDB-TDS_db 。TDS 连接将始终放置在此 UDB-TDS 数据库中,即使通过 T-SQL 不可见也是如此。每个 UDBTX 实例只能有一个 UDB-TDS 数据库。
由于 UDB-TDS 数据库最终是一个 UDBTX 数据库,因此从技术上讲,可以从 UDBTX 端口访问它并针对它运行 UDBTX SQL 语句。通过 UDBTX 访问 UDB-TDS 数据库时应谨慎,因为需要考虑复杂性。
一个简单的方法是完全避免从 UDBTX 访问 UDB-TDS 数据库。想要使用 UDBTX 功能是有正当理由的。例如,当 UDB-TDS 不支持 T-SQL 的特定方面时,可以在 UDBTX 中本机实现该方面,以允许将应用程序UDB-TDS 迁移到 UDBTX。
每当执行上下文不是纯 TDS/T-SQL 时,即在 UDB-TDS 上下文中执行 UDBTX SQL 语句时,互操作性注意事项就适用。当出现以下情况时,就是这种情况:
在 UDBTX 连接中,UDBTX 语句针对 UDB-TDS 创建的对象(例如表、视图、过程)执行。
在 TDS 连接中,T-SQL 语句针对 UDBTX 创建的对象(例如表、视图、过程)执行,或者在从 T-SQL 调用 UDBTX 内置函数时执行。根据客户反馈,这似乎是这些方案中更常见的。
在这两种情况下,这实际上意味着在访问/执行以不同的 SQL 语句创建的对象时,SQL 语句在会话中暂时(且透明地)切换(这不适用于访问表)。
当上述情况之一发生在基于 UDB-TDS 的应用程序中时,可能需要考虑以下一个或多个互操作性方面。UDB-TDS 用户负责确定具有此类混合 SQL 语句方案的应用程序是否按预期工作。此外,用户在升级到 UDB-TDS 的未来版本时应预见到潜在问题;此类问题可能需要由用户自己解决。
架构名称
UDB-TDS 通过将各种 SQL Server 数据库扁平化为 UDBTX 数据库(默认为 )中的架构来模拟 SQL Server 多数据库结构。例如,这意味着创建为 的 T-SQL 表和创建为的过程必须分别从 UDBTX 中引用 作为 table 和 procedure ,请参阅将 UDB-TDS 与单个数据库或多个数据库一起使用。此外,SQL Server 使用与 UDBTX 不同的规则来解析没有架构名称的对象名称。
在 UDB-TDS 数据库中操作连接的 UDBTX 时,必须考虑这些差异。
标识符
UDBTX 的最大标识符长度为 63 个字符,而 SQL Server 最多支持 128 个字符。此外,UDBTX 对索引名称有更严格的唯一性要求。UDB-TDS 通过在内部附加或替换部分此类标识符来处理这些限制,该字符串包含一个 32 个字符的字符串,表示该标识符的哈希值。虽然这在 T-SQL 中是透明的,但从 UDBTX 中查看时,标识符 with-hash 是对象名称。
例如,在表上命名的索引将在 UDB-TDS 内部命名。在这里,UDB-TDS 将索引名称与表名称沿着使用 MD5 生成的字符串连接起来,作为小写索引名称。
权限
为了实现 SQL Server 权限模型,UDB-TDS 创建了 UDBTX 角色来反映 SQL Server 数据库主体等概念。这些 UDB-TDS 管理的 UDBTX 构造在 T-SQL 中是透明的,但在 UDBTX 连接中是可见的。
重要的是要认识到,不应从 UDBTX 修改 UDB-TDS 管理的 UDBTX 角色,并且不应从 UDBTX 授予/撤消对 UDB-TDS 创建的对象的权限。虽然目前在技术上可以这样做,但这可能会导致 UDB-TDS 实例与 UDB-TDS 的未来版本不兼容,并可能导致未来的升级失败。它还可能导致 UDB-TDS 的当前或未来版本出现意外的权限配置,因为与安全相关的 T-SQL 语句可能由于干扰在 UDBTX 中执行的操作而无法获得预期结果。
UDB-TDS 保证 T-SQL 在 UDB-TDS 的 TDS 连接中创建的表(或其他 SQL 对象)在通过 UDBTX 端口与连接到 TDS 时具有相同的权限进行访问,而无需运行任何其他 UDBTX 语句(尽管此处列出的其他一些注意事项, 与架构名称更改一样,可能仍然适用)。但是,不能保证相反的方式:在 UDBTX 中创建对象时,它可能无法从 TDS 连接中可见或访问,或者可以使用不同的权限访问它。因此,应在 T-SQL 中创建将从 UDBTX 访问的架构和对象。
事务语义
尽管 T-SQL 和 UDBTX SQL 的语义基本相同,但在事务回滚和错误处理方面存在一些显着差异。例如,在违反约束的情况下,T-SQL 默认回滚发生错误的语句,然后继续执行下一个语句,同时保持活动事务处于打开状态。相比之下,UDBTX SQL 将回滚整个事务并退出区块。
从 TDS 连接执行 T-SQL 时,将应用 T-SQL 事务语义;在 UDBTX 连接上执行 UDBTX 语句时,将应用 UDBTX 事务语义。但是,在连接中混合或组合两种语句时,原则上将忽略 T-SQL 事务语义,仅使用 UDBTX 语义。这可能意味着 T-SQL 过程在 UDBTX 上下文中执行时的行为可能会有所不同。
多个结果集
T-SQL 支持从批处理或过程向客户端返回多个结果集,但 UDBTX 不支持:对于过程,UDBTX 根本不支持返回结果集,对于批处理,UDBTX 仅发送第一个结果集。在这种情况下,如果在 UDBTX 上下文中执行 T-SQL 过程/批处理,客户可能无法获得预期的结果。
默认排序规则
T-SQL 和 UDBTX SQL 中的默认排序规则不同,这可能会导致一些语义差异。例如,在 UDB-TDS T-SQL 中默认为 true,因为默认排序规则不区分大小写;但在 UDBTX SQL 中,默认情况下这将是 false,其中排序规则区分大小写。’a’ = ‘A’
未来的 UDB-TDS 升级
UDB-TDS 用户可能希望在 UDBTX 中实现迁移的 T-SQL 应用程序的一部分,最可能的原因是解决 UDB-TDS 当前不支持的特定 T-SQL 功能,因此用户随后尝试在 UDBTX 中实现该部分。如果 UDB-TDS 在将来的版本中开始支持这些功能,则应用程序将与该未来版本不兼容。这可能意味着升级后的未来实例可能无法正常工作,或导致升级失败。
互操作性方案
首先,最简单的零互操作性方案是将应用程序垂直拆分为 T-SQL 部分和 UDBTX 部分,每个部分都有自己的用户和架构,并且它们之间没有交互。应用程序将打开与 UDB-TDS 数据库的 TDS 连接,以及与单独的 UDBTX 数据库的 UDBTX 连接。在这种情况下,实际上在数据库级别上根本不存在互操作性问题,因为 UDBTX 访问和 T-SQL 访问是完全分开的,不会干扰。(请注意,当两个连接使用相同的用户名进行连接时,可能存在依赖关系)。
一个更相关的变体是 UDBTX 连接访问 UDB-TDS 数据库,但仅访问 UDBTX 创建的对象,而 T-SQL 仅访问 UDB-TDS 创建的对象(例如表、视图、过程)。在这种情况下,没有干扰,但在实践中,通常需要在 T-SQL 上下文和 UDBTX 上下文之间交换信息,例如通过经常访问的表。这样的表应该在 T-SQL 中创建,而不是在 UDBTX 中创建,但除此之外,这种情况应该没有问题。互操作性方面:模式名称;标识符;权限。
另一种几乎没有预期并发症的情况是 UDBTX 连接仅从 UDB-TDS 创建的表中读取。互操作性方面:模式名称;标识符;权限。从视图读取数据时,可能还有其他注意事项与这些视图引用的架构名称和标识符相关。
当 UDBTX 连接还修改 UDB-TDS 创建的表或执行 DDL 来修改此类对象时,事务语义方面也将适用。
更复杂的情况是,当 UDBTX 连接执行 T-SQL 过程(直接或通过 UDBTX 过程)或修改具有 UDB-TDS 创建的触发器的 UDB-TDS 创建的表时。生成的语义应由 UDB-TDS 用户仔细验证。
互操作性示例
不支持的语句
考虑一个包含 100 条语句的 T-SQL 存储过程,其中 UDB-TDS 完全支持 99 条语句,但 1 条语句不支持。如果可以将不受支持的语句重写为 UDBTX 过程并从 T-SQL 语句调用,则这可能是迁移该过程的解决方案。但是,在实践中,只有当过程的其余部分也在 UDBTX 中重写时,才能在 UDBTX 中表示不受支持的语句。用户需要决定在多大程度上重写、重构或重新设计 T-SQL 或 UDBTX 中的过程。
表分区
UDB-TDS 目前不支持 SQL Server 的表分区。可以在 UDB-TDS 中创建一个表,并在 UDBTX 中修改该表以应用分区。由于分区是一种性能特性,应该在功能上是中立的,因此原则上它应该有效。但是,如果将来的 UDB-TDS 版本支持 T-SQL 样式分区,它可能会与 UDB-TDS 不兼容。
全文搜索
通过重构应用程序,可以将执行全文搜索的应用程序迁移到 UDB-TDS,以便将全文搜索封装在 UDBTX 存储过程中,然后从 T-SQL 调用该存储过程。同样在这里,可能会出现与未来 UDB-TDS 版本的不兼容问题。
PostGIS 扩展
若要迁移具有地理空间 T-SQL 功能的应用程序,可以选择考虑使用 PostGIS 扩展。但是,这可能需要更广泛的重构,以及设计一种在 T-SQL 和 PostGIS 扩展之间传递数据的机制。将来的兼容性注意事项适用。
XML 处理
对于使用 XML 处理的 T-SQL 应用程序,如果 XML 功能可以拆分为 UDBTX 过程和函数,则可以使此功能正常工作。此类解决方法可能很复杂。将来的兼容性注意事项适用。