作者TeemingVoid (TeemingVoid)
看板Database
标题Re: [系统] DDL有没有类似Rollback的机制?
时间Tue Feb 7 02:49:22 2012
※ 引述《sohumi (皮老板)》之铭言:
: 一般在进行交易时,可用commit or rollback来决定是否存档.
: 如果是在资料库定义语言中 有类似这样的机制吗?
: 比方说下了一连串的Create/Alter tables,columns,index...等,
: 如果想回复到还没建立/异动时的状态,有方法可用吗?
: 还是只能手动改回?
Oracle、MySQL 印象中似乎还没有 transacton rollback DDL 的功能。
如果是 Microsoft SQL Server,可以「有条件」 rollback DLL 叙述。
有条件是指: create / alter / drop database 不能 rollback,其他
像是 restore database, restore log 等等也不可以,事实上,这些
只要一写进 begin tran ... rollback tran 之中,直接就是错误讯息。
其他常用的 DLL 叙述,像是您问到的 create table, alter table,
create index 等叙述,可以 rollback。 ^^
另外,提醒一下,由於 Trigger 一定会是 Transaction 的一部分,而
SQL Server 又是支援 DDL Trigger 的系统(从2005开始),所以,有可
能因为某一个 DDL Trigger 执行到 rollback,使得资料结构变成不能
修改,当然啦! 也有人用这个来帮资料结构加上安全锁:
create database TestDDLDB
go
use TestDDLDB
go
create table test (id int)
go
-- SQL Server 的 DDL 可以 Rollback
begin transaction
alter table test add data int
exec sp_columns 'test'
rollback transaction
go
-- 建立一个 DDL Trigger,修改或删除资料表时,会触发这个Trigger
create trigger SafetyLockForDLL
on database
for drop_table, alter_table
as
begin
print N'先停用 SafetyLockForDLL,才可以修改资料表'
rollback
end
go
-- 就算是不写 begin tran,trigger也会是自动transaction的一部分
-- 资料结构目前还是不能动
alter table test add data int
exec sp_columns 'test'
go
-- 停用 trigger
disable trigger SafetyLockForDLL on database
go
-- 现在可以修改资料结构
alter table test add data int
exec sp_columns 'test'
go
-- 恢复安全锁
enable trigger SafetyLockForDLL on database
go
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 111.252.125.143
1F:推 sohumi:太好了~省了很多工coding for rollback function ^^ 02/07 09:04
2F:推 gname:推... 我一直以为Oracle有..囧 02/07 09:30