--可以回滾 if object_id('tb')is not null drop table tb go create table tb(ID int ,sex nvarchar(2) check(sex in(N'男',N'女'))) insert tb select 1,N'男' insert tb select 2,N'女' declare @err int set @err=0 begin tran truncate table tb set @err=@err+abs(@@error) insert tb select 3,'asd' --錯誤語句 set @err=@err+abs(@@error) if @err=0 commit else rollback go select * from tb /*ID sex ----------- ---- 1 男 2 女(影響 2 個資料列) */
在Oracle中,只能回滚到truncate之后的操作,而回滚不到同一事务中truncate之前的操作。按这个测试结果,是SQL server 2000可以回滚truncate操作吗?
select * from abegin tran truncate table a select * from a rollback select * from a--结果如下, 代表能够回滚 aid aname ----------- ---------- 1 x 2 y(2 行受影响)aid aname ----------- ----------(0 行受影响)aid aname ----------- ---------- 1 x 2 y(2 行受影响)
--sql 不能在事务中使用的语句 ALTER DATABASE BACKUP LOG CREATE DATABASE DISK INIT DROP DATABASE DUMP TRANSACTION LOAD DATABASE LOAD TRANSACTION RECONFIGURE RESTORE DATABASE RESTORE LOG UPDATE STATISTICS
begin tran sql exception:rollback tran commit tran 整个这个是一个事务,我理解是不是回滚的是整个事务?而你其中的一部分语句只是事务的一部分而已。 回滚的是整个事务,而不是你其中的某条语句。
能回滚select * from abegin tran insert a values(3,'z') truncate table a insert a values(4,'a') select * from a rollback select * from a --结果 aid aname ----------- ---------- 1 x 2 y(2 行受影响) (1 行受影响)(1 行受影响) aid aname ----------- ---------- 4 a(1 行受影响)aid aname ----------- ---------- 1 x 2 y(2 行受影响)
insert t select 1go
begin tran
truncate table t
rollback tran
select * from tgo沒有事務時可用 log explorer恢復
insert
truncate如果执行
rollback那么回滚的是当前整个事务,而不只是truncate操作========================================
http://www.dbtuning.cn
主营:中小企业数据库管理、优化、调校服务
========================================
我在SQL2000的查询分析器中执行,t表有1条记录,也就是truncate回滚了。为什么?
如果truncate是不可回滚的话,应该有一个表是空的,为什么两个表都没变化呢?
我的理解,Rollback操作不是通过事务日志来做的,Truncate操作的数据还在缓存在Buffer里。
http://www.dbtuning.cn
主营:中小企业数据库管理、优化、调校服务
========================================
if object_id('tb')is not null drop table tb
go
create table tb(ID int ,sex nvarchar(2) check(sex in(N'男',N'女')))
insert tb select 1,N'男'
insert tb select 2,N'女'
declare @err int
set @err=0
begin tran
truncate table tb
set @err=@err+abs(@@error)
insert tb select 3,'asd' --錯誤語句
set @err=@err+abs(@@error)
if @err=0
commit
else
rollback
go
select * from tb
/*ID sex
----------- ----
1 男
2 女(影響 2 個資料列)
*/
truncate table a
select * from a
rollback
select * from a--结果如下, 代表能够回滚
aid aname
----------- ----------
1 x
2 y(2 行受影响)aid aname
----------- ----------(0 行受影响)aid aname
----------- ----------
1 x
2 y(2 行受影响)
ALTER DATABASE
BACKUP LOG
CREATE DATABASE
DISK INIT
DROP DATABASE
DUMP TRANSACTION
LOAD DATABASE
LOAD TRANSACTION
RECONFIGURE
RESTORE DATABASE
RESTORE LOG
UPDATE STATISTICS
sql
exception:rollback tran
commit tran
整个这个是一个事务,我理解是不是回滚的是整个事务?而你其中的一部分语句只是事务的一部分而已。
回滚的是整个事务,而不是你其中的某条语句。
既然测试结果说明是可以回滚的,那就是了。
在SQL Server里,Truncate table操作只是不记录日志,进而导致无法从日志中恢复被清空的数据。
insert a values(3,'z')
truncate table a
insert a values(4,'a')
select * from a
rollback
select * from a
--结果
aid aname
----------- ----------
1 x
2 y(2 行受影响)
(1 行受影响)(1 行受影响)
aid aname
----------- ----------
4 a(1 行受影响)aid aname
----------- ----------
1 x
2 y(2 行受影响)
大家都知道是回滚整个事务,只是在oracle中,一个事务中truncate操作之前的所有操作都会commit,之后的才rollback,我只是想看看和SQL server的区别。
请看清楚,我说的是回滚到truncate之后的操作。