當前流行的演進式的軟體開發模式,使資料庫的重構和變更成為軟體構建過程中的平常事情,當然資料庫的重構和變更涉及到許多設計和專案管理上的東西,我這裡只是給出乙個我遇到的關於資料庫變更的案例。
需求過程是這樣的:在資料庫設計已經大體完成,使用者突然提出要加強系統的資料跟蹤的能力,於是設計者要求在現在所有的資料表裡新增三列屬性col1,col2,col3以應對客戶的這種需求,由於負責這件事情的資料庫管理員的疏忽,把這三列設定成not null型別的,並且執行了滿足這個需求的指令碼。但是有的小組已經開始了資料庫的單元測試,顯然這三列在不設定預設值的前提下,這個指令碼的執行導致資料庫的有些資料表存在這三列,並且是not null型別,而有的資料表沒有這三列。設計者決定修改這三列是可以為null的,而不設定預設值。預期的資料庫是所有的資料表都有col1,col2,col3三列,並且是可為null的。顯然現在我們面對著乙個亂七八糟的資料庫。如何解決這個問題呢?
1 如果在資料庫變更前存有最近的備份,就還原資料庫,修改執行指令碼的列可為null的就可以了。
2 如果恰巧資料庫管理員沒有及時的備份,那就得根據情況重新編寫執行指令碼了。在這種情況下可以遍歷所有的使用者表,檢測每個表是否有col1,col2,col3,如果存在,修改列的值可以是null,如果不存在則新增col1,col2,col3,並設定列的值可為null。示例**如下:
declare @tablename nvarchar(50)
declare @sql1 nvarchar(200)
declare @sql2 nvarchar(200)
declare cur cursor for
select name from sysobjects where xtype='u' and status>=0 order by name
open cur
---遍歷所有的表
fetch next from cur into @tablename
--set @@tablename=convert(
while @@fetch_status =0
begin
--檢測是否存在col1,col2,col3列
if not exists( select * from syscolumns where id =object_id(@tablename) and (name='col2' or name='col3' or name='col1'))
begin
set @sql1=n'alter table '+@tablename+' add col1 varchar(50) null,col2 varchar(50) null,col3 varchar(50) null'
print @sql1
exec sp_executesql @sql1
end---存在列,修改列,使其值可為null
else
begin
set @sql2=n'alter table '+ @tablename +' alter column col1 varchar(50) null'
exec sp_executesql @sql2
set @sql2=n' alter table '+ @tablename +' alter column col2 varchar(50) null'
exec sp_executesql @sql2
set @sql2=n'alter table '+ @tablename +' alter column col3 varchar(50) null'
exec sp_executesql @sql2
print @sql2
exec sp_executesql @sql2
end
--print @tablename
fetch next from cur into @tablename
endclose cur
deallocate cur
很顯然以上兩種方式,第一種方式最為安全,簡單。這就要求資料庫管理員要及時備份資料庫,特別是資料庫重構,變更前。注重資料庫的版本控制,對每次重構或變更的執行版本要和資料庫版本聯絡起來。
資料庫 儲存過程
儲存過程,stored procedure,是在大型資料庫系統中,一組為了完成特定功能的sql語句集,經編譯後儲存在資料庫中,使用者通過指定儲存過程的名字並給出引數 如果該儲存過程帶有引數 來執行它。模擬於c中的函式。mysql與sqlserver是不同的。建立儲存過程 conn getconnec...
資料庫 儲存過程
在資料庫中,儲存過程屬於一種物件,是一種高效的安全的訪問資料庫的方法。下邊我們就資料庫中的儲存過程總結它的相關知識點。我們分為概述,實現和管理三個方面來總結。一,儲存過程的概述 1,概念 儲存過程 storedprocedure 是在資料庫伺服器端執行的一組t sql語句的集合,經編譯後存放在資料庫...
資料庫 儲存過程
一組為了完成特定功能的sql 語句集,經編譯後儲存在資料庫中。使用者通過指定儲存過程的名字並給出引數 如果有引數 來執行它。系統儲存過程 以sp 開頭,用來進行系統的各項設定.取得資訊.相關管理工作。本地儲存過程 使用者建立的儲存過程是由使用者建立並完成某一特定功能的儲存過程,這跟各種程式語言裡使用...