數據庫升級工具

數據庫升級方案sql

點擊查看視頻介紹數據庫

 

1、面臨的問題數據結構

在項目中數據庫升級是常常遇到的事情,這個工做比較繁瑣,特別是在線數據庫升級須要十分當心,咱們先來看一下一般面臨的問題:函數

一、    表修改,包括增長了字段、修改了字段類型或者長度,更換了主鍵等。對於表的升級不能刪除重建,須要單獨修改,或者寫腳原本升級。工具

二、    視圖的修改,視圖的修改比較簡單,無非是增長了字段,取消了字段,不影響基礎數據。視圖的升級能夠刪除重建。spa

三、    存儲過程的修改,存儲過程的修改和視圖同樣,能夠刪除重建,兩者均可以經過腳原本完成。code

四、    函數的修改,若是項目中用到了函數,函數的升級和存儲過程同樣,再也不贅述。orm

五、    上述狀況基本能涵蓋了大部分的數據庫升級的情景,這些工做能夠在數據庫管理工具中完成,也可編寫腳原本完成。我想說的問題並非這個,而是有時候咱們不知道那個表,那個字段修改了,除非你每改一個地方都作好記錄,儘管如此,在升級的時候也不免落下。視頻

咱們公司有一套Web開發平臺、由此平臺開發了一套進銷存,一套oa系統,而進銷存又延伸出兩套行業版進銷存:鞋服通醫藥通,以上產品有興趣的能夠去官網www.hfbpm.com試用,產品線以下圖:對象

 

數據庫和基礎功能都是繼承的,即進銷存使用開發平臺中的表,醫藥通和鞋服通使用通用進銷存中的表,oa使用開發平臺中的表,那麼它們之間的數據庫升級就很是頻繁,剛開靠手工記錄改動的地方,針對性的升級,後來發現工做量很是大,並且常常出錯。

有沒有一個一勞永逸的辦法,比較差別進行數據庫升級?只要思想不滑坡辦法總比困難多!

辦法確定是有的。

2、解決方案

要解決數據庫升級,主要是解決針對表、視圖、存儲過程函數的升級,後面三個相對來講比較簡單,直接刪除重建便可,難點是如何獲取三者的建立腳本?只要獲取到完整的腳本,當作sql語句執行便可,mssqlServer也給出了方法(下面會具體介紹)。表的升級相對來講要麻煩一些,由於表不能刪除重建,必須對列、主鍵、約束等逐項進行比較升級,對於新建的表沒有提供獲取建立表腳本的方法,須要本身來處理。

下面詳細介紹升級過程。

一、  表建立

MsSqlServer沒有提供獲取建立表腳本的方法,須要本身根據列屬性生成建立腳本,爲此咱們編寫了一個存儲過程Sys_TableScript_MSSQL來作這件事情,存儲過程的代碼以下圖:

 

因爲篇幅限制,詳細代碼就不貼出來了,這個方法也是從博客園裏收到的,稍微改動了一下,執行後輸出的結果以下:

 

獲取的是一個完整的建立表的腳本,該腳本當作普通的sql語句執行便可。

二、表升級

當表已經存在時,針對列進行升級,若是列不存在直接建立,若是列存在,那麼是否升級判斷依據是長度、類型、小數點位數、容許爲空、默認值是否發生改變,上述只要有其一發生變化就要升級。

建立列的sql腳本,以下:

ALTER TABLE 表名 ADD 列名  類型  not null default '默認值'

例如

ALTER TABLE dx_ZhiBan ADD  leaderName  varchar(50)  not null default '未填'

若是列已經存在須要使用修改列的sql腳本,以下:

ALTER TABLE 表名 alter column 列名 類型 not null

例如

alter table dx_ZhiBan alter column Leader nvarchar(50) not null

修改列時若是修改默認值,修改列的腳本不支持直接修改默認值,由於列一旦建立了默認值,那麼就建立了一個約束,須要先刪除這個約束,再從新建立默認值。刪除默認值約束須要先找到默認值約束的名字,再執行刪除約束腳本。查找默認值約束的sql腳本以下:

select c.name from sysconstraints a

inner join syscolumns b on a.colid=b.colid

inner join sysobjects c on a.constid=c.id

where a.id=object_id('表名') and b.name='列名'

找到約束的名字以下圖:

 

刪除默認值約束的sql腳本以下圖:

alter table 表名 drop constraint 默認值約束名

例如:

alter table dx_ZhiBan drop constraint DF__dx_ZhiBan__Leade__3FE65219

刪除默認值後,再執行建立默認值的sql腳本,以下:

alter table 表名 add default '默認值' for 列名 with values

例如:

alter table dx_ZhiBan add default '未填' for Leader with values

表的升級除了列還包括主鍵,主鍵的升級和默認值相似(由於他們都屬於約束),須要先刪除原來,再建立新的。查找主鍵約束的sql腳本以下:

  Select name from sysobjects where Parent_Obj=OBJECT_ID('表名') and xtype='PK'

例如:

 Select name from sysobjects where Parent_Obj=OBJECT_ID('dx_ZhiBan') and xtype='PK'

查找結果以下:

 

刪除主鍵約束的sql腳本以下:

Alter table dx_ZhiBan Drop PK_dx_ZhiBan

建立主鍵的sql腳本以下:

ALTER TABLE dx_ZhiBan ADD PRIMARY KEY (ID, leader )

注意,聯合主鍵用逗號分隔,另外,須要說明的是在升級以前要判斷主鍵是否須要升級,若是主鍵沒有變化就不須要升級。

三、視圖升級

視圖升級過程較簡單,刪除掉從新建立便可。刪除視圖的sql腳本以下:

drop view 視圖名

獲取視圖建立腳本的sql腳本,以下:

EXEC sp_helptext @objname='視圖名稱'

執行後結果以下圖:

 

獲取到該腳本後,當作普通的sql語句執行便可。

四、存儲過程、函數升級

兩者的升級和視圖相似,再也不贅述,不一樣的是刪除存儲過程的sql腳本是:

drop procedure 存儲過程名

刪除函數的sql腳本是:

drop function 函數名

五、數據庫升級工具

數據庫的升級是都能經過sql腳原本完成的,把這些腳本管理起來須要藉助程序來完成,咱們使用net的WinForm來編寫程序。以下圖:

 

使用這個工具能夠選擇那些對象須要升級(沒有勾選的不升級),升級的時候能看到進度和升級結果。

本方案並非十全十美的,有些問題還沒解決,例如列名稱修改、如何刪除多餘的列等。其餘不當之處歡迎你們留言指正。

點擊查看視頻介紹

相關文章
相關標籤/搜索