[筆記]退版程式原則

[筆記]退版程式原則

之前有做AP層的退版程式作業,最近讀的書正好有講到這塊,試作順便紀錄。

退版程式原則

資料庫的修改只能是增量的

對於資料表格的關聯性尚未廢除前,只能新增資料庫的欄位表格,不能刪除;每一個版本應該包括清除上一個版本遺留不再需要的資料。

舉例

原先資料表格定義如下

表格名稱

EMPTEST

欄位名稱

描述

STAFF

員工編號

NAME

員工姓名

1

內容

2

表格名稱

EFORM

欄位名稱

描述

EMPID

員工編號

NO

電子表單編號

RECORDDATE

填報日期

3

內容

4

如果要新增一個欄位DEPID(部門代號)到表格EMPTEST,最保險的做法就是在NAME的後面新增DEPID欄位。最後修改如下:

5

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的程式路徑,不必退回整個程式。

舉例

利用權限控管開放新功能讓部份使用者進行測試,如果採用隨機選取使用者的方式一定要通知使用者體驗新功能。

 

參考資料

高拓展性网站的50条原则