分享
 
 
 

Oracle数据库向MSSQLServer7.0的迁移(3)

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

死锁

当一个进程锁定另一个进程需要的页或表,而后者又锁定了前者所需要的页时,死锁就发生了。死锁也称为“僵局”。SQL Server 自动检测并处理死锁。如果发现了死锁,服务器就会终止处于“僵局”的用户进程。

每次数据修改后,程序代码都应检测消息编号 1205,它用于指示死锁。如果返回了这个消息编号,则发生了死锁,并且事务被回滚。在这种情况下,应用程序必须重新启动事务。

使用一些简单的技巧,就可以避免死锁:

应用程序的各个部分均使用相同的顺序访问表。

在每个表上使用聚集索引,来实施显式行排序。

使事务保持简短。

有关详细信息,请参见 Microsoft Knowledge Base 文章:Detecting and Avoiding Deadlocks in Microsoft SQL Server(Microsoft SQL Server 死锁的检测和避免)。

在 Oracle 中,要执行远程事务,必须能够使用数据库链接,来访问远程数据库节点。在 SQL Server 中,则必须能够访问一个“远程服务器”。远程服务器是在网络上运行 SQL Server 的一个服务器,用户可使用本地服务器对它进行访问。当一个服务器被设置为远程服务器时,用户无须显式登录,就可以使用其上的系统过程和存储过程。

远程服务器是成对设置的。必须对两个服务器进行配置,使之均将对方作为远程服务器。必须使用 sp_addlinkedserver 系统存储过程或 SQL Server Enterprise Manager,把每个服务器的名称加入它的伙伴名称中。

设置远程服务器之后,使用 sp_addremotelogin 系统存储过程或 SQL Server Enterprise Manager,为必须访问远程服务器的用户设定远程登录 ID。这一步完成之后,必须授予此执行存储过程的权限。

然后,使用 EXECUTE 语句,运行远程服务器上的过程。以下示例执行了远程服务器 STUDSVR1 上的 validate_student 存储过程,并把指示成功或失败的返回状态存储在 @retvalue1 中:

DECLARE @retvalue1 int

EXECUTE @retvalue = STUDSVR1.student_db.student_admin.validate_student '111111111'

有关详细信息,请参见 SQL Server Books Online。

如果在两个或多个网络数据库节点上对表进行更改,Oracle 就会自动启动一个分布式事务。SQL Server 分布式事务则使用包含在 SQL Server 中的 Microsoft 分布式事务处理协调器 (MS DTC) 的两阶段提交服务。

默认情况下,必须指示 SQL Server 参与分布式事务。可以使用以下方法之一,使 SQL Server 开始参与 MS DTC 事务:

使用 BEGIN DISTRIBUTED TRANSACTION 语句。这个语句开始一个新的 MS DTC 事务。

使用直接调用 DTC 事务接口的客户应用程序。

在此例中,请注意对本地表 GRADE 和远程表 CLASS(使用 class_name 过程)的分布式更新:

BEGIN DISTRIBUTED TRANSACTION

UPDATE STUDENT_ADMIN.GRADE

SET GRADE = 'B+' WHERE SSN = '111111111' AND CCODE = '1234'

DECLARE @retvalue1 int

EXECUTE @retvalue1 = CLASS_SVR1.dept_db.dept_admin.class_name '1234', 'Basketweaving'

COMMIT TRANSACTION

GO

如果应用程序不能完成此事务,应用程序就会使用 ROLLBACK TRANSACTION 语句取消它。如果应用程序失败或参与的资源管理器失败,MS DTC 就会取消此事务。MS DTC 不支持分布式保存点或 SAVE TRANSACTION 语句。如果一个 MS DTC 事务终止或回滚,整个事务被回滚到分布式事务的起始处,无论有多少个保存点都是如此。

Oracle 和 MS DTC 两阶段提交机制在操作上是类似的。在 SQL Server 两阶段提交的第一阶段中,事务管理器请求每个参加的资源管理器为提交做准备。如果任何资源管理器不能准备,则事务管理器向事务所涉及的每个人广播终止决定。

如果所有资源管理器都可以成功地准备,则事务管理器广播提交决定。这是提交过程的第二阶段。当资源管理器在准备时,它不知道事务将被提交还是被终止。MS DTC 有一个有序日志,这样就可以永久保存提交或终止决定。如果资源管理器或事务管理器失败,它们重新连接时,就可重新处理有疑问的事务。

SQL 语言支持

这一部分概述了 Transact-SQL 和 PL/SQL 语言语法之间的相同点和不同点,并给出转换策略。

要将 Oracle DML 语句和 PL/SQL 程序迁移到 SQL Server 时,请按下列步骤执行:

验证所有 SELECT、INSERT、UPDATE 和 DELETE 语句的语法是有效的。进行任何必要的修改。

把所有外部联接改为 SQL-92 标准外部联接语法。

用相应 SQL Server 函数替代 Oracle 函数。

检查所有的比较运算符。

用“+”字符串串联运算符代替“||”字符串串联运算符。

用 Transact-SQL 程序代替 PL/SQL 程序。

把所有 PL/SQL 游标改为非游标 SELECT 语句或 Transact-SQL 游标。

用 Transact-SQL 过程代替 PL/SQL 过程、函数和包。

把 PL/SQL 触发器转换为 Transact-SQL 触发器。

使用 SET SHOWPLAN 语句,优化查询性能。

SELECT 语句

Oracle 和 Microsoft SQL Server 使用的 SELECT 语句语法类似。

SQL Server 不支持 Oracle 特定的基于开销的优化程序提示,它必须被删除。建议使用的技术是,使用 SQL Server 基于开销的优化程序。有关详细信息,请参见本章后面的“SQL 语句优化”。

SQL Server 不支持 Oracle 的 START WITHUCONNECT BY 子句。在 SQL Server 中,可以创建完成相同任务的存储过程替代它。

SQL Server 不支持 Oracle 的 INTERSECT 和 MINUS 集合运算符。可使用 SQL Server EXISTS 和 NOT EXISTS 子句,实现相同的结果。

在下面示例中,使用 INTERSECT 运算符,用于查找学生登记的所有课程的代码和名称。注意,EXISTS 运算符是如何代替 INTERSECT 运算符的。返回的数据是相同的。

Transact-SQL values_list 参数提供了 SQL-92 标准关键字 DEFAULT,但 Oracle 不支持。此关键字指定了,执行插入操作时使用列的默认值。如果指定列的默认值不存在,则插入 NULL。如果该列不允许 NULL,则返回一个错误消息。如果该列数据类型定义为 timestamp,则插入下一个有序值。

标识符列不能使用 DEFAULT 关键字。要生成下一个序列号,拥有 IDENTITY 属性的列不能列在 column_list 或 values_clause 中。不需使用 DEFAULT 关键字,来获取列的默认值。正如在 Oracle 中,如果列没有在 column_list 中引用,并且它有默认值,则默认值存放在列中。这是迁移时可使用的最兼容的方法。

一个有用的 Transact_SQL 选项 (EXECute procedure_name) 是,执行一个过程并将其结果用管道输出到目标表或视图中。Oracle 不允许这样做。

UPDATE 语句

因为 Transact SQL 支持 Oracle UPDATE 命令使用的绝大多数语法,所以只需要极少的修改。

在 SQL Server 中,此语句只能由表的所有者执行。在 Oracle 中,如果是表的所有者或拥有 DELETE TABLE 系统权限,就可以执行此命令。

Oracle TRUNCATE TABLE 命令可以有选择地释放表中行所占用的存储空间。SQL Server TRUNCATE TABLE 语句总是收回表数据及其相关索引所占用的空间。

标识符列和时间戳列中数据的处理

Oracle 序列是与任何给定的表或列均不直接相关的数据库对象。列和序列之间的关系是在应用程序中实现的,即通过编程的方法将序列值赋给列。因此,Oracle 使用序列时,并不实施任何规则。但是,在 Microsoft SQL Server 标识符列中,值不能被更新,并且不能使用 DEFAULT 关键字。

默认情况下,数据不能直接插入到标识符列。标识符列自动给表中插入的每个新行生成一个唯一的序列号。可以使用下列 SET 语句改写这种默认设置:

SET IDENTITY_INSERT table_name ON

将 IDENTUTY_INSERT 设为 ON,用户就可以向新行的标识符列插入任何值。要防止出现有重复号码的条目,必须为该列创建唯一索引。这条语句的目的是,允许用户给无意中删除的行重新创建一个值。@@IDENTITY 函数可用来获取上一个标识值。

TRUNCATE TABLE 语句将标识符列重置为其起始 SEED 值。如果不想重置列的标识值,则不使用 TRUNCATE TABLE 语句,而使用不带 WHERE 子句的 DELETE 语句。必须评估它对 Oracle 迁移造成的影响,因为 ORACLE SEQUENCE 在 TRUNCATE TABLE 命令之后不被重置。

处理 timestamp 列时,只能执行插入和删除。如果要更新一个 timestamp 列,会收到以下的错误信息:

Msg 272, Level 16, State 1 Can't update a TIMESTAMP column.

锁定请求的行

Oracle 使用 FOR UPDATE 子句来锁定 SELECT 命令中指定的行。不需要在 Microsoft SQL Server 中使用对等的子句,因为这是默认行为。

行合计和 COMPUTE 子句

SQL Server COMPUTE 子句用于生成行合计函数(SUM、AVG、MIN、MAX 和 COUNT),它们在查询结果中作为附加行出现。它允许查看一组结果的详细和汇总信息

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有