Re: [系統] DDL有沒有類似Rollback的機制?

看板Database作者 (TeemingVoid)時間14年前 (2012/02/07 02:49), 編輯推噓2(200)
留言2則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

02/07 09:04, , 1F
太好了~省了很多工coding for rollback function ^^
02/07 09:04, 1F

02/07 09:30, , 2F
推... 我一直以為Oracle有..囧
02/07 09:30, 2F
文章代碼(AID): #1FC22qty (Database)
文章代碼(AID): #1FC22qty (Database)