Re: [系統] DDL有沒有類似Rollback的機制?
※ 引述《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
02/07 09:04, 1F
推
02/07 09:30, , 2F
02/07 09:30, 2F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):