在開發過程中線上的數據庫表字段和本地數據庫表字段是存在的,也許我們在本地數據庫中所增加的表字段都會有記錄到SQL文件中,但當增加的表及字段名稱較多時總會出現漏網之魚,發布真是版本的時候回出現很多很多的問題,那么如何在發布新的版本時保證線上數據庫與本地數據庫中的表字段都是統一的了,下面我說一個比較笨的方法去保證兩個數據庫無差異。
1、將線上的數據庫架構生成成為SQL,操作如下: 選擇中某線上數據庫 → 任務 → 生成腳本 → 下一步 → 選擇對象窗口,選擇(編寫整個數據庫及所有數據庫對象的腳本)下一步 → 設置腳本編寫選項窗口,輸出類型選項卡中選擇 “將腳本保存到特定的位置” 點擊“高級”按鈕,彈出 高級腳本編寫選項,將出現“表/試圖選項”及“常規”,在“常規選項中”找到“ 要編寫腳本的數據的類型 ”項 選擇 “僅限架構” 點擊“確定”按鈕,在文件名選項中選擇文件保存的路徑 → 下一步 → 下一步 → 完成 。
2、在本地新建一個數據庫(數據庫名稱不能和將要對比的數據庫名稱一樣),然后在新創建的數據庫中執行第一個步保存的文件。
3、開始對比兩個數據庫,執行如下SQL語句,如下SQL語句中INTFSIMSNEW 表示新數據庫(線上數據庫,也就是剛剛第二步新建的數據庫),INTFSIMS 表示舊數據庫(本地數據庫),將如下SQL語句中所有 INTFSIMSNEW 替換成你新建的數據庫名稱,INTFSIMS 替換成你本地的數據庫名稱
-- u表,p存儲過程,v視圖 -- INTFSIMSNEW新庫,INTFSIMS舊庫 SELECT NTABLE = A.NAME, OTABLE = B.NAME FROM INTFSIMSNEW..SYSOBJECTS A LEFT JOIN INTFSIMS..SYSOBJECTS B ON A.NAME = B.NAME WHERE ISNULL(B.NAME, '') = '' AND A.XTYPE = 'U' UNION ALL SELECT NTABLE = B.NAME, OTABLE = A.NAME FROM INTFSIMS..SYSOBJECTS A LEFT JOIN INTFSIMSNEW..SYSOBJECTS B ON A.NAME = B.NAME WHERE ISNULL(B.NAME, '') = '' AND A.XTYPE = 'U' ORDER BY 1, 2 -- 比較兩個數據庫中每個表字段的差異 SELECT 表名A = CASE WHEN ISNULL(A.TABLENAME, '') <> '' THEN A.TABLENAME ELSE B.TABLENAME END, 字段名A = A.FIELDNAME, 字段名B = B.FIELDNAME, 順序= A.FIELDSNO, 說明= CASE WHEN A.FIELDTYPE <> B.FIELDTYPE THEN '類型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE WHEN A.FIELDSNO <> B.FIELDSNO THEN '順序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO) WHEN A.LENGTH <> B.LENGTH THEN '長度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH) WHEN A.LENSEC <> B.LENSEC THEN '小數位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC) WHEN A.ALLOWNULL <> B.ALLOWNULL THEN '允許空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL) END FROM (SELECT TABLENAME = B.NAME, FIELDNAME = A.NAME, FIELDSNO = A.COLID, FIELDTYPE = C.NAME, LENGTH = A.LENGTH, LENSEC = A.XSCALE, ALLOWNULL = A.ISNULLABLE FROM INTFSIMSNEW..SYSCOLUMNS A LEFT JOIN INTFSIMSNEW..SYSOBJECTS B ON A.ID = B.ID LEFT JOIN INTFSIMSNEW..SYSTYPES C ON A.XUSERTYPE = C.XUSERTYPE WHERE B.XTYPE = 'U') A FULL JOIN (SELECT TABLENAME = B.NAME, FIELDNAME = A.NAME, FIELDSNO = A.COLID, FIELDTYPE = C.NAME, LENGTH = A.LENGTH, LENSEC = A.XSCALE, ALLOWNULL = A.ISNULLABLE FROM INTFSIMS..SYSCOLUMNS A LEFT JOIN INTFSIMS..SYSOBJECTS B ON A.ID = B.ID LEFT JOIN INTFSIMS..SYSTYPES C ON A.XUSERTYPE = C.XUSERTYPE WHERE B.XTYPE = 'U') B ON A.TABLENAME = B.TABLENAME AND A.FIELDNAME = B.FIELDNAME WHERE ISNULL(A.TABLENAME, '') = '' OR ISNULL(B.TABLENAME, '') = '' OR A.FIELDTYPE <> B.FIELDTYPE OR A.FIELDSNO <> B.FIELDSNO OR A.LENGTH <> B.LENGTH OR A.LENSEC <> B.LENSEC OR A.ALLOWNULL <> B.ALLOWNULL ORDER by 1, 4
在開發過程中線上的數據庫表字段和本地數據庫表字段是存在的,也許我們在本地數據庫中所增加的表字段都會有記錄到SQL文件中,但當增加的表及字段名稱較多時總會出現漏網之魚,發布真是版本的時候回出現很多很多的問題,那么如何在發布新的版本時保證線上數據庫與本地數據庫中的表字段都是統一的了,下面我說一個比較笨的方法去保證兩個數據庫無差異。
1、將線上的數據庫架構生成成為SQL,操作如下: 選擇中某線上數據庫 → 任務 → 生成腳本 → 下一步 → 選擇對象窗口,選擇(編寫整個數據庫及所有數據庫對象的腳本)下一步 → 設置腳本編寫選項窗口,輸出類型選項卡中選擇 “將腳本保存到特定的位置” 點擊“高級”按鈕,彈出 高級腳本編寫選項,將出現“表/試圖選項”及“常規”,在“常規選項中”找到“ 要編寫腳本的數據的類型 ”項 選擇 “僅限架構” 點擊“確定”按鈕,在文件名選項中選擇文件保存的路徑 → 下一步 → 下一步 → 完成 。
2、在本地新建一個數據庫(數據庫名稱不能和將要對比的數據庫名稱一樣),然后在新創建的數據庫中執行第一個步保存的文件。
3、開始對比兩個數據庫,執行如下SQL語句,如下SQL語句中INTFSIMSNEW 表示新數據庫(線上數據庫,也就是剛剛第二步新建的數據庫),INTFSIMS 表示舊數據庫(本地數據庫),將如下SQL語句中所有 INTFSIMSNEW 替換成你新建的數據庫名稱,INTFSIMS 替換成你本地的數據庫名稱
-- u表,p存儲過程,v視圖
-- INTFSIMSNEW新庫,INTFSIMS舊庫
SELECT NTABLE = A.NAME, OTABLE = B.NAME FROM INTFSIMSNEW..SYSOBJECTS A LEFT JOIN INTFSIMS..SYSOBJECTS B ON A.NAME = B.NAME WHERE ISNULL(B.NAME, '') = '' AND A.XTYPE = 'U' UNION ALL SELECT NTABLE = B.NAME, OTABLE = A.NAME FROM INTFSIMS..SYSOBJECTS A LEFT JOIN INTFSIMSNEW..SYSOBJECTS B ON A.NAME = B.NAME WHERE ISNULL(B.NAME, '') = '' AND A.XTYPE = 'U' ORDER BY 1, 2 -- 比較兩個數據庫中每個表字段的差異 SELECT 表名A = CASE WHEN ISNULL(A.TABLENAME, '') <> '' THEN A.TABLENAME ELSE B.TABLENAME END, 字段名A = A.FIELDNAME, 字段名B = B.FIELDNAME, 順序= A.FIELDSNO, 說明= CASE WHEN A.FIELDTYPE <> B.FIELDTYPE THEN '類型: ' + A.FIELDTYPE + '-->' + B.FIELDTYPE WHEN A.FIELDSNO <> B.FIELDSNO THEN '順序: ' + str(A.FIELDSNO) + '-->' + str(B.FIELDSNO) WHEN A.LENGTH <> B.LENGTH THEN '長度: ' + str(A.LENGTH) + '-->' + str(B.LENGTH) WHEN A.LENSEC <> B.LENSEC THEN '小數位: ' + str(A.LENSEC) + '-->' + str(B.LENSEC) WHEN A.ALLOWNULL <> B.ALLOWNULL THEN '允許空值: ' + str(A.ALLOWNULL) + '-->' + str(B.ALLOWNULL) END FROM (SELECT TABLENAME = B.NAME, FIELDNAME = A.NAME, FIELDSNO = A.COLID, FIELDTYPE = C.NAME, LENGTH = A.LENGTH, LENSEC = A.XSCALE, ALLOWNULL = A.ISNULLABLE FROM INTFSIMSNEW..SYSCOLUMNS A LEFT JOIN INTFSIMSNEW..SYSOBJECTS B ON A.ID = B.ID LEFT JOIN INTFSIMSNEW..SYSTYPES C ON A.XUSERTYPE = C.XUSERTYPE WHERE B.XTYPE = 'U') A FULL JOIN (SELECT TABLENAME = B.NAME, FIELDNAME = A.NAME, FIELDSNO = A.COLID, FIELDTYPE = C.NAME, LENGTH = A.LENGTH, LENSEC = A.XSCALE, ALLOWNULL = A.ISNULLABLE FROM INTFSIMS..SYSCOLUMNS A LEFT JOIN INTFSIMS..SYSOBJECTS B ON A.ID = B.ID LEFT JOIN INTFSIMS..SYSTYPES C ON A.XUSERTYPE = C.XUSERTYPE WHERE B.XTYPE = 'U') B ON A.TABLENAME = B.TABLENAME AND A.FIELDNAME = B.FIELDNAME WHERE ISNULL(A.TABLENAME, '') = '' OR ISNULL(B.TABLENAME, '') = '' OR A.FIELDTYPE <> B.FIELDTYPE OR A.FIELDSNO <> B.FIELDSNO OR A.LENGTH <> B.LENGTH OR A.LENSEC <> B.LENSEC OR A.ALLOWNULL <> B.ALLOWNULL ORDER by 1, 4