请教关于数据操作回滚的问题
时间:2011-12-15
来源:互联网
CREATE TABLE tb1 (id1 INT, id2 DECIMAL(4, 1)) INSERT INTO tb1 SELECT 1, 4.3 UNION ALL SELECT 2, 234.2 现在把字段id2的数据类型改为decimal(4,2),数据库生成脚本如下: BEGIN TRANSACTION SET QUOTED_IDENTIFIER ON SET ARITHABORT ON SET NUMERIC_ROUNDABORT OFF SET CONCAT_NULL_YIELDS_NULL ON SET ANSI_NULLS ON SET ANSI_PADDING ON SET ANSI_WARNINGS ON COMMIT BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_tb1 ( id1 int NULL, id2 decimal(4, 2) NULL ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_tb1 SET (LOCK_ESCALATION = TABLE) GO IF EXISTS(SELECT * FROM dbo.tb1) EXEC('INSERT INTO dbo.Tmp_tb1 (id1, id2) SELECT id1, id2 FROM dbo.tb1 WITH (HOLDLOCK TABLOCKX)') GO DROP TABLE dbo.tb1 GO EXECUTE sp_rename N'dbo.Tmp_tb1', N'tb1', 'OBJECT' GO COMMIT 如果这样执行操作,数据将会丢失,因为有数据溢出。 问题: 语句中的回滚操作怎么不生效呢?还是说回滚对这类操作无效呢?求教执行这类操作时如果进行数据回滚
作者: eriato 发布时间: 2011-12-15
作者: ssp2009 发布时间: 2011-12-15
作者: fredrickhu 发布时间: 2011-12-15
CREATE TABLE tb1 (id1 INT, id2 DECIMAL(4, 1)) INSERT INTO tb1 SELECT 1, 4.3 UNION ALL SELECT 2, 234.2 begin try begin tran alter table tb1 alter column id2 DECIMAL(4, 2) commit tran end try begin catch rollback tran select error_number() as error_number , error_message() as error_message, error_state() as error_state, error_severity() as error_severity end catch error_number error_message error_state error_severity ------------ --------------------------------------------------------------------- ----------- -------------- 8115 Arithmetic overflow error converting numeric to data type numeric. 8 16 (1 row(s) affected)
作者: ap0405140 发布时间: 2011-12-15
当数据量少,字段也少,我们可以直接通过alter一条语句修改,但是当数据量大,且字段也多的时候,想修改多个字段的属性,比如字段类型、长度、位置等,直接alter的话容易造成“数据库未响应、超时”,需要通过重建表格(或者有更好的办法?),这样的话,就不仅仅一条alter语句可以解决了。这样的话,又该如何设置回滚呢?每一条操作都可能造成数据丢失。
作者: eriato 发布时间: 2011-12-15
如果是20个字段的表,你要修改其中19个的字段类型、长度、位置等,
那倒不如建个新表,直接从原表导入即可.
SQL code
create table 新表([字段列表,想要的数据类型.]) insert into 新表 select [字段列表,做类型调整.] from 原表
作者: ap0405140 发布时间: 2011-12-15
把所有的操作语句都放到一个事务里面,不用GO分块,这样就在任意一条操作出现错误的时候回滚所有操作了。不知道这样理解有没有错呢?
比如:
SQL code
CREATE TABLE [dbo].[tb1]( [id1] [int] PRIMARY KEY NOT NULL, [id2] [decimal](5, 2) NULL, [id3] [varchar](50) NULL) CREATE INDEX ix_tb1 ON dbo.tb1(id3) INSERT INTO tb1 SELECT 1, 4.3, '23' UNION ALL SELECT 2, 234.2, 'fsw' BEGIN TRANSACTION SET XACT_ABORT ON SET ANSI_WARNINGS ON SET NUMERIC_ROUNDABORT OFF CREATE TABLE dbo.tb2 ( id1 int NULL, id2 decimal(4, 2) NULL, id3 VARCHAR(50) ) INSERT INTO dbo.tb2 (id1, id2, id3) SELECT id1, id2, id3 FROM dbo.tb1 DROP TABLE dbo.tb1 EXECUTE sp_rename N'dbo.tb2', N'tb1', 'OBJECT' COMMIT TRANSACTION 但是这样存在一个问题,表格的各种索引、关系等都无法复制过去,看来只能先把原来的表格生成SQL代码,再将其修改了。
作者: eriato 发布时间: 2011-12-15
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28