[筆記]退版程式原則
之前有做AP層的退版程式作業,最近讀的書正好有講到這塊,試作順便紀錄。
退版程式原則
資料庫的修改只能是增量的
對於資料表格的關聯性尚未廢除前,只能新增資料庫的欄位表格,不能刪除;每一個版本應該包括清除上一個版本遺留不再需要的資料。
舉例
原先資料表格定義如下
表格名稱
EMPTEST
欄位名稱 |
描述 |
STAFF |
員工編號 |
NAME |
員工姓名 |
內容
表格名稱
EFORM
欄位名稱 |
描述 |
EMPID |
員工編號 |
NO |
電子表單編號 |
RECORDDATE |
填報日期 |
內容
如果要新增一個欄位DEPID(部門代號)到表格EMPTEST,最保險的做法就是在NAME的後面新增DEPID欄位。最後修改如下:
DDL及DML必須是腳本化並且測過的
每個版本對於資料庫的修改必須透過腳本(Scripting)實現,不能手動執行(例如透過SSMS之類的資料庫管理工具對資料庫直接修改);其中應該包括退回(Rollback)的版本。
原因如下:
1. 團隊需要在QA或者某個階段測試退回步驟(Rollback),驗證是否有遺漏項目。
2. 需要在一定負載條件下測試腳本,確定應用程式在使用資料庫的時候,它能夠執行。
舉例
剛剛我們新增了DEPID(部門代號)的欄位,必須產生新增欄位的sql語法,並且包含退回的語法。語法如下:
-- 新增DEPID(部門代號)欄位
ALTER table dbo.EMPTEST ADD DEPID char(6) null
-- 刪除DEPID(部門代號)欄位:退回(Rollback)使用
ALTER table dbo.EMPTEST DROP COLUMN DEPID
對於應用程式中的SQL查詢進行約束
開發團隊需要進行工作如下:
1. 清除所有SQL語句的歧異
2. 刪除所有 select * 的查詢
3. 給Update語句加上要更新的欄位名稱
舉例
原先前端網頁的SQL查詢也做調整:
-- 前端AP的修改
-- 原始的查詢
SELECT *
FROM
dbo.EMPTEST
SELECT a.STAFF
, a.NAME
, b.NO
, b.RECORDDATE
FROM
dbo.EMPTEST a
INNER JOIN dbo.EFORM b
ON a.STAFF = b.EMPID
-- 原始的更新
DECLARE @NO nvarchar(20)
DECLARE @EMPID char(6)
SET @NO = N'A1'
SET @EMPID = '123456'
UPDATE dbo.EFORM
SET
RECORDDATE = getdate()
WHERE
[NO] = @NO AND
EMPID = @EMPID;
-- 1.清除所有SQL語句的歧異
-- 將dbo.EFORM.EMPID rename為 dbo.EFORM.STAFF
EXEC sp_rename 'dbo.EFORM.EMPID', 'STAFF', 'COLUMN';
-- 驗證是否修改成功
SELECT STAFF
FROM
dbo.EFORM
-- 2.刪除所有 select * 的查詢
-- 修改前
SELECT *
FROM
dbo.EMPTEST
-- 修改後
SELECT STAFF
, NAME
, DEPID
FROM
dbo.EMPTEST
-- 驗證修改前後的查詢結果是否相同(應該為0筆)
SELECT *
FROM
dbo.EMPTEST
EXCEPT
SELECT STAFF
, NAME
, DEPID
FROM
dbo.EMPTEST;
SELECT STAFF
, NAME
, DEPID
FROM
dbo.EMPTEST
EXCEPT
SELECT *
FROM
dbo.EMPTEST;
-- 修改join的部份
SELECT a.STAFF
, a.NAME
, b.NO
FROM
dbo.EMPTEST a
INNER JOIN dbo.EFORM b
ON a.STAFF = b.STAFF
--3. 給Update語句加上要更新的欄位名稱
-- 修改前
DECLARE @NO nvarchar(20)
DECLARE @EMPID char(6)
SET @NO = N'A1'
SET @EMPID = '123456'
UPDATE dbo.EFORM
SET
RECORDDATE = getdate()
WHERE
[NO] = @NO AND
EMPID = @EMPID;
-- 修改後
DECLARE @NO nvarchar(20)
DECLARE @STAFF char(6)
SET @NO = N'A1'
SET @STAFF = '123456'
UPDATE dbo.EFORM
SET
RECORDDATE = getdate()
WHERE
[NO] = @NO AND
STAFF = @STAFF;
資料的語意修改
在發佈版本中,如果對應程式未上線,開發團隊不能修改資料的定義
舉例
目前部門的代號有下列三種
部門代號 |
部門名稱 |
RD |
研發 |
HR |
人資 |
FI |
財會 |
假使要新增QA(測試團隊)部門,可是前端頁面沒有發布新版的程式,則員工資料的部門代號不可以有QA。
Wire On /Wire Off
應用程式結構化,根據外部配置,讓某些用戶可以使用新增功能,而有的用戶不能;配置方式可以分為下列幾種:
1. 存放在配置文件中(例如web.config)。
2. 存放在資料庫中:可以根據角色或者隨機百分比分配使用權限。
能夠讓有限的用戶對新功能進行beta測試,而且能夠迅速刪除主要bug的程式路徑,不必退回整個程式。
舉例
利用權限控管開放新功能讓部份使用者進行測試,如果採用隨機選取使用者的方式一定要通知使用者體驗新功能。
參考資料