甲骨文到SQL Server和SQL Server到Oracle迁移指南 - PT。 3.

Leonid拥有20多年的多平台开发人员和DBA,在Oracle和SQL Server跨平台迁移中具有特殊专业知识。

首先第二 本系列的部分讨论了Oracle银河游戏官方首页和Microsoft SQL Server之间的差异,在执行事务的实现中,以及生成的转换陷阱以及一些常用的语法元素。

最后一期将涵盖概念 甲骨文 读取一致性以及如何基于此概念转换架构中的架构 Microsoft SQL Server. 版本。它还将解决使用同义词(以及如何使用它们)以及更改控制过程在管理银河游戏官方首页环境中的作用。

甲骨文读取一致性及其等效于SQL Server

甲骨文读一致 是一个保证单个SQL语句返回的所有数据都来自同一个奇异的时间点。

It means that if you issued a SELECT statement at 12:01:02.345 and it ran for 5 minutes before returning result set, all data (and only data) that has been committed in the database as of 12:01:02.345 will make it into your return set. Your return set won’t have any new data added during those 5 minutes that it took the database to process your statement, nor any updates, and no deletes will be visible.

甲骨文架构通过内部时间戳到数据的每一个更改和构建从两个来源集的结果集:永久数据文件和撤消段(或“回滚段”(或“回滚段”)的结果集实现了读一致性 因为它已知直到版本10G)。

为了支持它,撤消信息 应该保留. If it’s overwritten, it results in the infamous 或者A-01555: snapshot too old error.

Leaving aside undo segment management—and how to navigate the 或者A-01555: snapshot too old error—let’s look at the implications of read consistency on any practical implementation in Oracle. Also, how should it be mirrored in SQL Server, which—as is the case with other RDBMS implementations, with the possible and qualified exception of PostgreSQL—does not support it?

关键是Oracle读取和写入不互相阻止。这也意味着您的长时间运行查询返回集可能没有最新数据。

非阻塞读取和写入是Oracle所拥有的优势 影响事务范围.

但读一致性也意味着您没有数据的最新状态。当在某些情况下,它完全不错(如为特定时间的报告),它可能会在其他方面创造重要的问题。

没有最新的“脏”或“未提交的数据可能是至关重要的:经典场景是酒店房间预订系统。

考虑以下用例:您有两个客户服务代理商,同时接受客房预订订单。如何确保房间不会过度预订?

In SQL Server, you can start an explicit transaction and SELECT a record from the list (which could be a table or a view) of available rooms. As long as this transaction is not closed (either by COMMIT or ROLLBACK), no one can get the same room record that you’ve selected. This prevents double-booking but also makes every other agent wait for each other to complete reservation requests one at a time, sequentially.

In Oracle, you can achieve the same result by issuing a SELECT ... FOR UPDATE statement against records matching your search criteria.

注意:存在更好的解决方案,例如设置标记房间“正在考虑的房间”而不是盲目地锁定访问。但这些是架构解决方案,而不是语言选择。

结论:Oracle读一致性不是“全部好”或“全部糟糕”,但需要良好的平台的重要属性,并且对于跨平台代码迁移至关重要。

公共(和私人)在Oracle和Microsoft SQL Server中的同义词

“公共同义词是邪恶的。”它的 不是我个人的发现,但我在公共同义词的一天,一周和年份之前接受了它作为福音。

在许多银河游戏官方首页环境中 - 我会说我有机会合作的所有Oracle环境,但是我设计了使用 CREATE PUBLIC SYNONYM 对于每个对象 是常规的,因为“我们一直这样做。”

在这些环境中,公共同义词只有一个函数:允许引用对象而不指定其所有者。这是一个 思考不好的理由 制作公共同义词。

然而,Oracle公共同义词非常有用,并提供团队生产力的好处,如果正确地实现和管理,并且有一个原因,可以显着超过他们的所有缺点。是的,我说“团队生产力”。但怎么样?为此,我们需要了解Oracle中的名称如何运行。

甲骨文解析器查找名称(非保留关键字)时,它会尝试按以下顺序将其与现有银河游戏官方首页对象相匹配:

使用my_object作为输入开始的流程图。发布会话的当前模式是否具有名为my_object的对象?如果是这样,我们'重做。如果没有,发布会话的当前架构是否具有名为my_object的私有同义词?如果是这样,我们将该对象中的同义词解析为对象,我们'重做。如果没有,是否有一个名为my_object的公共同义词?如果是这样,请解决它,我们'重做。如果没有,请查看使用此名称的架构。如果我们找到一个,我们'重做。如果没有,请提出错误。

Note: The error raised will be 或者A-00942: table or view does not exist for DML statements, or PLS-00201: identifier 'my_object' must be declared for stored procedures or function calls.

在此名称解析顺序中,很容易看到当开发人员在自己的架构工作时,任何具有与公共同义词相同名称的本地对象将 隐藏 这个公开的同义词。 (注意:Oracle 18c实现了“仅登录”模式类型,此讨论不适用于它。)

缩放团队的公共同义词:Oracle Change Control

现在让我们看看一个在同一银河游戏官方首页上工作的100个开发人员的假设团队(这是我经历的东西)。此外,让我们假设他们都在本地工作,并独立地完成非银河游戏官方首页构建,都链接到同一银河游戏官方首页开发环境。在“非银河游戏官方首页代码中的代码合并(是c#,java,c ++,python或其他任何其他)的分辨率将在更改控制调查时间完成,并且将使用下一个代码构建生效。但是,在正在进行的开发期间,需要多次更改银河游戏官方首页表,代码和数据。每个开发人员都独立完成,它立即生效。

为此,所有银河游戏官方首页对象都在公共应用程序模式中创建。这是 应用程序参考的架构。每个开发人员:

  • 使用其个人用户帐户/架构连接到银河游戏官方首页
  • 始终以空的个人架构开头
  • 仅通过名称解析引用公共架构到公共同义词,如上所述

当开发人员需要制作时 任何 changes to the database—create or alter a table, change procedure code, or even modify a set of data to support some test scenario—they create a copy of the object in their personal schema. They do this by getting DDL code using the DESCRIBE command and running it locally.

从这一刻起,这个开发人员的代码将看到对象和数据的本地版本,这不会看到(也不会对其产生影响)。开发完成后,将修改后的银河游戏官方首页代码进行源控制,并解决冲突。然后,在公共架构中实现最终代码(和数据,如果需要)。

在此之后,整个开发团队可以再次查看同一银河游戏官方首页。刚刚传递代码的开发人员将所有对象从他/她的个人架构中删除,并准备好进行新分配。

这种促进多个开发人员的独立并行工作的能力是公共同义词的主要好处 - 这是一个难以夸大的重要性。但是,在实践中,我继续看到团队在Oracle实现中创建公众同义词“只是因为我们总是这样做。”相比之下,在使用SQL Server的团队中,我没有看到创建作为常见做法的公共同义词。功能存在但不经常使用。

在SQL Server中,用户配置中定义了用户的当前默认模式,如果您有“更改用户”权限,则可以随时更改。可以实现与上述Oracle中描述的相同精确的方法。但是,如果未使用此方法,则不应复制公共同义词。

由于Microsoft SQL Server默认情况下与其自己的架构与其自己的架构相关联(如Oracle Do),因此关联应该是标准“创建用户”脚本的一部分。

下面是创建专用用户模式的脚本的示例,并将一个分配给用户。

First, create schemas for new users that need to be onboarded to the database named DevelopmentDatabase (each schema must be created in its own batch):

use DevelopmentDatabase;
GO
CREATE SCHEMA Dev1;
GO
CREATE SCHEMA Dev2;
GO

其次,使用指定的默认架构创建第一个用户:

CREATE LOGIN DevLogin123  WITH PASSWORD = 'first_pass123';    
CREATE USER Dev1 FOR LOGIN DevLogin123 WITH DEFAULT_SCHEMA = Dev1;  
GO

At this point, the default schema for user Dev1 would be Dev1.

接下来,创建具有默认架构的其他用户:

CREATE LOGIN DevLogin321  WITH PASSWORD = 'second_pass321';    
CREATE USER Dev2 FOR LOGIN DevLogin321;
GO

The default schema for user Dev2 is dbo.

Now alter user Dev2 to change its default schema to Dev2:

ALTER USER Dev2 WITH DEFAULT_SCHEMA = Dev2;
GO

Now the default schema for user Dev2 is Dev2.

This script demonstrates two ways to assign and change a default schema for a user in Microsoft SQL Server databases. As SQL Server supports multiple methods of user authentication (the most common is Windows authentication) and user onboarding may be handled by system administrators rather than by DBAs, the ALTER USER method of assigning/changing default schema will be more usable.

注意:我使架构的名称与用户的名称相同。在SQL Server中不一定是这样的,但它是我的偏好,因为(1)它匹配它在Oracle和(2)中的完成方式,它简化了用户管理(解决DBA对DBA的最大反对,以便正确地处理DBA的最大反对首先) - 您知道用户的名称,您可以自动了解用户的默认模式。

结论:公共同义词是构建稳定和受保护的多用户开发环境的重要工具。不幸的是,在我在行业的观察中,它更常用于错误的原因 - 离开团队遭受困扰的混乱和其他缺陷的公共同义词而不实现他们的利益。改变这种做法源于来自公共同义词的真正优势可以为团队的开发工作流带来真正的好处。

银河游戏官方首页访问管理和更改管理流程

正如我们刚才谈到大型团队支持平行开发的支持,值得讨论一个单独的和误解的主题:改变控制进程。

改变管理通常成为由团队领导和DBA控制的红色磁带的形式,因叛逆的开发商而鄙视,他们希望提供一切的人,如果不是“昨天”那么“现在”。

作为DBA,我总是把保护障碍放在进入“我的”银河游戏官方首页的路上。我有一个非常好的原因:银河游戏官方首页是共享资源。

在源控制上下文中,通常接受更改管理,因为它允许团队从新的但破碎的代码返回到旧的或工作代码。但在银河游戏官方首页上下文中,变更管理似乎可以像DBAS放置的一套不合理的障碍和限制:这是纯粹的疯狂,不需要发动的发展!

让我们离开这个开发人员的咆哮:我是一个dba,我不会把石头扔掉!作为DBA,我总是把保护障碍放在进入“我的”银河游戏官方首页的路上。我有一个非常好的原因:银河游戏官方首页是共享资源。

每个开发团队 - 他们的每个开发人员都有一个非常具体的目标和非常特定的可交付。每天在DBA桌面上的唯一目标是银河游戏官方首页作为共享资源的稳定性。 DBA在组织中具有独特的作用,以监督所有团队的所有开发工作,并控制所有开发人员访问的银河游戏官方首页。这是DBA,确保所有项目和所有进程都在运行而不会使对方进行干扰,并且每个都具有功能所需的资源。

问题是,当开发和DBA团队都坐在各自的象牙塔中时。

开发人员不知道,没有访问权限,甚至不关心银河游戏官方首页中发生的事情,只要它对它们运行很好。 (这不是他们的可交付,也不会影响他们的绩效评估。)

DBA团队将银河游戏官方首页保持靠近胸部,保护它从开发人员保护它,他们“无所谓”它,因为他们的团队目标是银河游戏官方首页稳定性。确保稳定性的最佳方法是防止破坏性变化 - 通常导致尽可能多地保护银河游戏官方首页的态度。

这些 对银河游戏官方首页的态度冲突 正如我所看到的那样,可以导致发展和DBA团队之间的敌意,导致不可行的环境。但是,DBA和发展团队必须共同努力,实现共同目标:提供业务解决方案,这是首先将它们带到一起的业务解决方案。

一直在开发者 - DBA鸿沟的两侧,我知道当DBA更好地了解开发团队的共同任务和目标时,问题很容易解决。在他们身边,开发人员需要看到一个银河游戏官方首页,而不是作为抽象概念,而是作为共享资源 - 而且,DBA应该承担教育者的作用。

The most common error that non-developer DBAs make is restricting developer access to the data dictionary and to code optimization tools. Access to Oracle DBA_ catalog views, dynamic V$ views, and SYS tables seems to many DBAs as “DBA privileged” when, in fact, these are critical development tools.

The same holds true for SQL Server, with one complication: Access to some system views cannot be granted directly, yet it’s only part of the SYSADMIN 银河游戏官方首页 role, and this role should never be granted outside of the DBA team. This can be solved (and should be solved in the case of a project’s migration from Oracle to SQL Server) by creating views and stored procedures that execute under SYSADMIN privileges but are accessible by non-DBA users. This is 发展dba 配置为新的SQL Server开发环境进行操作。

数据保护是DBA的主要职责之一。尽管如此,开发团队完全访问未过滤的生产数据是非常常见的,以允许对数据相关的票证进行故障排除。这些是相同的开发人员,这些开发人员有限地访问数据结构结构,这些结构是由它们创建的或首先为它们创建的。

当建立发展和DBA团队之间的适当工作关系时,创建一个良好的变化控制过程就会直观。银河游戏官方首页侧变更管理的具体细节和挑战是银河游戏官方首页同时的刚性和流动性 - 结构是刚性的,数据是流体。

它经常发生在结构修改-i.e上的变更管理 - i.,在数据定义语言中,或者DDL - 在数据变化时缺乏更改管理。理由简单 - 数据变化一直。

但如果我们更接近地看,我们会看到在任何系统中,所有数据都属于两类:应用程序数据和用户数据之一。

应用程序数据 是定义应用程序行为的数据字典,并与其进程一样重要。与任何其他应用程序更改一样,对此数据的更改应在严格的变更控制过程中。为了在更改控制过程中创建透明度进行应用程序数据的变化,应明确分隔应用程序数据和用户数据。

在Oracle中,它应该通过将应用程序和用户数据分别在其自己的架构中放置。在Microsoft SQL Server中,应通过将每个模式放入单独的模式或 - 更好 - 进入单独的银河游戏官方首页来完成。使这些选择应该是迁移规划的一部分:Oracle有两级名称解析(架构/所有者 - 对象名称),而SQL Server有三级名称解析(银河游戏官方首页 - 架构/所有者 - 对象名称)。

oracle和sql server世界之间的常见困惑源 - 也许是令人惊讶的 - 术语 银河游戏官方首页服务器:

SQL. Server.术语 甲骨文术语 定义
服务器 银河游戏官方首页 (可互换使用 服务器 在共同的思考中,除非专门参考服务器硬件,操作系统或网络元素;物理/虚拟服务器上可以有一个或多个银河游戏官方首页) 通过网络端口将“讨论”到其他实例的运行实例
银河游戏官方首页 (服务器的一部分,包含多个模式/副主者) 架构/所有者 最顶级的分组

在跨平台迁移项目中应清楚地理解该术语混合,因为术语误解可能导致难以解决的配置决策不正确。

应用程序和用户数据的正确分离允许DBA团队解决其第二个最重要的问题:用户数据安全性。随着用户数据分开地居住,实现a将非常简单 打破玻璃程序 根据需要根据需要进行用户数据访问。

结论:更改控制过程在任何项目中都至关重要。在软件工程中,银河游戏官方首页侧的变更管理往往被忽略,因为数据被视为“太流体”。但它完全是因为数据是“流体”和“持久”,同时设计精心设计的变化控制过程应该是适当银河游戏官方首页环境架构的基石。

关于代码迁移工具的使用

标准的第一方工具, 甲骨文迁移工作台SQL. Server.迁移助理,可以有助于代码迁移。但需要考虑到什么是 80/20规则:当代码正确迁移80%时,解决剩余的20%将需要80%的迁移工作。

使用迁移工具的最大风险是迄今为止的“银弹”感知。可能会想到,“它会做这项工作,我只需要做一些清理和整理。”由于转换团队的这种态度及其技术领导地位,我观察了一个失败的项目。

另一方面,我需要四个工作日来完成使用Notepad ++的批量替换功能作为主编辑工具的中型Microsoft SQL Server 2008系统(约200个对象)的基本转换。

迁移工具可以解析到目前为止已解决的关键迁移元素都没有。

当然,请使用迁移辅助工具,但请记住,这些提供仅限编辑援助。由此产生的输出文本需要进行审查,修改和在某些情况下重写,以便成为价值的代码。

人工智能工具的开发可能会解决这些迁移工具在未来缺陷,但我希望银河游戏官方首页之间的差异将在此之前模糊,并且任何迁移过程本身都会变得不必要。因此,只要需要这些类型的项目,我们需要使用老式的人类智能来做旧的方式。

结论:使用迁移援助工具是有帮助的,但它不是“银弹”,任何转换项目仍需要详细审查上述要点。

甲骨文 / SQL Server迁移:始终仔细查看

甲骨文和Microsoft SQL Server是企业环境中的两个最增殖的RDBMS平台。两者都具有基本符合ANSI SQL标准,并且可以在很小的修改中移动小区的代码段,甚至是。

这种相似之处会产生一种欺骗性的印象,即跨越两个平台的迁移是一个简单的直接的任务,并且可以轻松地采用相同的应用程序,从使用一个RDBMS后端到另一个。

在实践中,这种平台迁移远非微不足道,必须考虑每个平台内部工作的精细元素,最重要的是他们为数据管理最关键的元素实施了支持:事务。

虽然我涵盖了一个处于专业知识的核心的两个RDBMS平台,但同样的警告 - “看起来不像是指它有效” - 应该应用于任何其他SQL兼容的银河游戏官方首页管理系统之间的移动代码。在所有情况下,首先关注的重点应该是如何实现交易管理的实施方式与目标平台之间的不同之处。

理解基础知识

甲骨文中的数据一致性是多少?

在Oracle中,数据一致性基于多版本控制:引用单个时间点的任何版本的数据都应该处于一个状态,使其没有违反活动银河游戏官方首页约束。

oracle中的读一致性是什么?

甲骨文读一致性是一个SQL语句级别保证,所有数据都将以一致的状态返回 - 因为它在提交语句的时间点处于执行时。为了支持这一点,Oracle在时间内管理与多个点对应的多个数据。

银河游戏官方首页一致性检查是什么?

银河游戏官方首页一致性检查是一个验证银河游戏官方首页处于一致状态的过程,并且没有丢失或损坏的数据块。它应该在备份和在硬件故障后恢复其功能的银河游戏官方首页执行。

SQL.中的数据一致性是多少?

在符合SQL标准的银河游戏官方首页中,数据一致性是指数据的状态,其中它没有违反任何活动银河游戏官方首页约束。这是在任何交易结束时必须满足的基本要求。

oracle中的私有同义词和公共同义词是什么?

甲骨文私有同义词是在特定模式中创建的,并且可以通过模式引用访问与任何其他模式对象相同的方式。另一方面,公共同义词是在公共组中创建的,可以在没有任何架构引用的情况下访问。

如何更改Oracle中的同义词?

在Oracle中,要更改同义词的对象是指的,因此需要删除和重新创建同义词。

什么是Oracle实例?

甲骨文实例是整个背景进程集和分配的内存,其构成Oracle银河游戏官方首页作为存储和操纵数据的应用程序。