數(shù)據(jù)庫命名規(guī)則參考,網(wǎng)上摘錄
命名規(guī)則
1 表名
XXX相關(guān)表以r_作為前綴,YYY相關(guān)表以t_作為前綴。如r_acc 、t_bcc。
后臺表名盡量與前臺表名相同,后臺獨(dú)有的表應(yīng)以_b作為后綴。如r_gggd_b。
命名應(yīng)盡量反映存儲的數(shù)據(jù)內(nèi)容。
2 視圖名
視圖以v_作為前綴。由于前臺無視圖,故不需加_b。
命名應(yīng)盡量體現(xiàn)各視圖的功能。
3 觸發(fā)器名
觸發(fā)器名為相應(yīng)的表名加上后綴,Insert觸發(fā)器加‘_i‘,Delete觸發(fā)器加‘_d‘,Update觸發(fā)器加‘_u‘,如:r_bch_i,r_bch_d,r_bch_u。
4 存儲過程名
存儲過程應(yīng)以‘sp_‘開頭,后續(xù)部分主要以動賓形式構(gòu)成,并用下劃線分割各個組成部分。如增加BSC機(jī)架的DRT單板的存儲過程為‘sp_ins_board_drt‘。
5 變量名
變量名采用小寫,若屬于詞組形式,用下劃線分隔每個單詞,如@my_err_no。
6 命名中其他注意事項
以上命名都不得超過30個字符的系統(tǒng)限制。
變量名的長度限制為29(不包括標(biāo)識字符@)。
數(shù)據(jù)對象、變量的命名都采用英文字符。禁止使用中文命名。
3 編程結(jié)構(gòu)和描述
SQL SERVER系統(tǒng)中,一個批處理是從客戶傳給服務(wù)器的一個完整的包,可以包含若干條SQL語句。批處理中的語句是作為一組去進(jìn)行語法分析、編譯和執(zhí)行的。觸發(fā)器、存儲過程等數(shù)據(jù)對象則是將批處理永久化的方法。
3.1 注釋
注釋可以包含在批處理中。在觸發(fā)器、存儲過程中包含描述性注釋將大大增加文本的可讀性和可維護(hù)性。本規(guī)范建議:
1、 注釋以英文為主。
實際應(yīng)用中,發(fā)現(xiàn)以中文注釋的SQL語句版本在英文環(huán)境中不可用。為避免后續(xù)版本執(zhí)行過程中發(fā)生某些異常錯誤,建議使用英文注釋。
2、 注釋盡可能詳細(xì)、全面。
創(chuàng)建每一數(shù)據(jù)對象前,應(yīng)具體描述該對象的功能和用途。
傳入?yún)?shù)的含義應(yīng)該有所說明。如果取值范圍確定,也應(yīng)該一并說明。取值有特定含義的變量(如boolean類型變量),應(yīng)給出每個值的含義。
3、 注釋語法包含兩種情況:單行注釋、多行注釋
單行注釋:注釋前有兩個連字符(--),最后以行尾序列(CR-LF)結(jié)束。一般,對變量、條件子句可以采用該類注釋。
多行注釋:符號/*和*/之間的內(nèi)容為注釋內(nèi)容。對某項完整的操作建議使用該類注釋。
4、 注釋簡潔,同時應(yīng)描述清晰。
3.2 函數(shù)注釋:
編寫函數(shù)文本--如觸發(fā)器、存儲過程以及其他數(shù)據(jù)對象--時,必須為每個函數(shù)增加適當(dāng)注釋。該注釋以多行注釋為主,主要結(jié)構(gòu)如下:
/************************************************************************
*name : --函數(shù)名
*function : --函數(shù)功能
*input : --輸入?yún)?shù)
*output : --輸出參數(shù)
*author : --作者
*CreateDate : --創(chuàng)建時間
*UpdateDate : --函數(shù)更改信息(包括作者、時間、更改內(nèi)容等)
*************************************************************************/
CREATE PROCEDURE sp_xxx
...
3.3 條件執(zhí)行語句if...else
條件語句塊(statenemt block,以 begin...end為邊界)僅在if子句的條件為真時才被執(zhí)行。為提高代碼的可讀性,建議嵌套不多于5層。還有,當(dāng)嵌套層次太多時,應(yīng)該考慮是否可以使用case語句。
3.4 重復(fù)執(zhí)行while和跳轉(zhuǎn)語句goto
需要多次執(zhí)行的語句,可以使用while結(jié)構(gòu)。其中,控制while循環(huán)的條件在任何處理開始之前需要先執(zhí)行一次。循環(huán)體中的保留字break無條件的退出while循環(huán),然后繼續(xù)處理后續(xù)語句;保留字continue重新計算while條件,如果條件為真,則從循環(huán)開始處重新執(zhí)行各語句。
使用跳轉(zhuǎn)語句goto和標(biāo)簽label也可以方便地實現(xiàn)循環(huán)和其他更靈活的操作。SQL SERVER僅具有單通道語法分析器,因此不能解析對尚未創(chuàng)建的對象所做的前向參考。換言之,跳轉(zhuǎn)到某標(biāo)簽的后續(xù)語句應(yīng)該是可執(zhí)行的(如不存在可能尚未創(chuàng)建的數(shù)據(jù)對象)。
3.5 書寫格式
數(shù)據(jù)庫服務(wù)器端的觸發(fā)器和存儲過程是一類特殊的文本,為方便開發(fā)和維護(hù),提高代碼的易讀性和可維護(hù)性。規(guī)范建議按照分級縮進(jìn)格式編寫該文本。
順序執(zhí)行的各命令位于同一級;條件語句塊(statenemt block,以 begin...end為邊界)位于下一級,類推。
SQL語句是該文本的主體。為適應(yīng)某些教復(fù)雜的用戶需求,SQL語句可能比較龐大。為方便閱讀和維護(hù),規(guī)范建議按照SQL語句中系統(tǒng)保留字的關(guān)鍵程度再劃分為三級。具體分級請參照下表。其中,非系統(tǒng)保留字(如字段名、數(shù)據(jù)表名、標(biāo)點符號)相對本級保留字再縮進(jìn)一級。多個連續(xù)的非保留字可以分行書寫,也可以寫在同一行。當(dāng)WHERE包含的條件子句教復(fù)雜時,應(yīng)該每行只寫一個條件分句,并為重要的條件字句填寫單行注釋。
在保證基本縮進(jìn)格式的前提下,可以通過對齊某些重要關(guān)鍵字(如條件關(guān)鍵字AND、OR,符號 = 、 <> 等)來進(jìn)一步提高文本的易讀性和可維護(hù)性。
相鄰兩級的縮進(jìn)量為10個空格。這也是ISQL編輯器默認(rèn)的文本縮進(jìn)量。另外,在ISQL編輯器中,一個TAB鍵也相當(dāng)于10個空格。
注:按照功能,四類SQL語句(SELECT、INSERT、UPDATE、DELETE)的關(guān)鍵字可以劃分為三類:主關(guān)鍵字、次關(guān)鍵字、一般關(guān)鍵字。如下表所示:
主關(guān)鍵字 次關(guān)鍵字 一般關(guān)鍵字
SELECTINSERT (INTO)UPDATEDELETE FROMWHEREVALUESINSERT...SELECT...FROM語句中的SELECT和FROM ANDORBETWEENINLIKE
3.6 字體
系統(tǒng)保留字應(yīng)大寫,包括系統(tǒng)公共變量等。其他字符(如用戶自定義變量、用戶自定義數(shù)據(jù)對象名)小寫。
需要特殊強(qiáng)調(diào)的部分可以大寫。
一條完整注釋語句的首字符應(yīng)大寫。對某變量、某條件字句的注釋可以全部使用小寫。
通過下一節(jié)中生成表r_a的刪除觸發(fā)器的實例可以部分說明對象命名、注釋、基本書寫格式和字符大小寫方面的一些注意事項。
4 觸發(fā)器編程規(guī)范
4.1 范例
下面通過一個例子,說明觸發(fā)器編程中應(yīng)遵守的規(guī)范:
/* delete related r_a according to deleted table */
CREATE TRIGGER r_a_d ON r_a
FOR DELETE
AS
IF @@ROWCOUNT = 0 -no rows deleted
RETURN
/* delete r_b table related to deleted table */
DELETE r_b
FROM r_b b, deleted d
WHERE b.id=d.id
IF @@ERROR != 0
BEGIN
RAISERROR("Error occurred deleting related records", 16, 1)
ROLLBACK TRAN
END
RETURN
作以下幾點說明:
1. 檢查是否有行被修改。注意:不論數(shù)據(jù)是否被修改,觸發(fā)器都會引發(fā),執(zhí)行情況取決于T-SQL語句的執(zhí)行,而和任何潛在的where子句是否執(zhí)行無關(guān)。
2. 因為被刪除行在該表中不再可用,所以應(yīng)在被刪除的表中查看。
3. 檢查T-SQL語句的返回代碼,以捕獲任何出錯條件。
4.2 事務(wù)過程中的觸發(fā)器
1. 觸發(fā)器內(nèi)的rollback將所有工作返回至最外層的begin tran,完成觸發(fā)器內(nèi)的處理并異常終止當(dāng)前的批處理。
2. 不可以從觸發(fā)器內(nèi)部返回至某個已命名的事務(wù)過程,這將產(chǎn)生運(yùn)行錯誤,掛起所有工作并終止批處理。
5 存儲過程編程規(guī)范
5.1 帶有參數(shù)的執(zhí)行
在執(zhí)行存儲過程時,可以通過名字來制定參數(shù),這樣可以用任何順序傳遞參數(shù),而且自動起到注釋的作用,因此建議編程時使用這種方法。
5.2 缺省參數(shù)值
把參數(shù)的缺省值定為null,這是捕獲在過程內(nèi)調(diào)用存儲過程所產(chǎn)生的錯誤的常用方法,不應(yīng)讓標(biāo)準(zhǔn)服務(wù)器消息報告參數(shù)丟失。在給定缺省之后,可以校驗該缺省值并在存儲過程內(nèi)采取措施。
注意,當(dāng)附值SELECT語句不返回行時,局部變量將保持在SELECT語句執(zhí)行之前所具有的值。建議使用系統(tǒng)提供的某些全局變量(如@@ROWCOUNT)檢測SELECT返回的結(jié)果。
5.3 返回值
每個存儲過程自動返回一個整數(shù)型的狀態(tài)值:成功完成時返回0,而返回-1~-99表示SQL Server檢測到了錯誤。以下為SQL Server系統(tǒng)常用的返回狀態(tài)碼:
值 含義
0 Procedure was executed successfully
-1 Object missing
-2 Datatype error occurred
-3 Process was chosen as deadlock victim
-4 Permission error occurred
-5 Syntax error occurred
-6 Miscellaneous user error occurred
-7 Resource error, such as out of space, occurred
-8 Non-fatal internal problem encountered
-9 System limit was reached
-10 Fatal internal inconsistency occurred
-11 Fatal internal inconsistency occurred
-12 Table or index is corrupt
-13 Database is corrupt
-14 Hardware error occurred
在程序中,用return語句可指定大于0或小于-99的返回值,調(diào)用程序可以設(shè)置局部變量接收和檢查返回狀態(tài)。
5.4 存儲過程和事務(wù)處理
如果事務(wù)處理在存儲過程返回時的嵌套層次與執(zhí)行時的層次不同,SQL Server會顯示信息提示事務(wù)處理嵌套失控。因為存儲過程并不異常終止該批處理,在執(zhí)行和確認(rèn)隨后的語句時,過程內(nèi)的rollback tran 會導(dǎo)致數(shù)據(jù)完整性損失。
在編寫存儲過程時,應(yīng)遵守以下原則:
1. 過程對@@trancount應(yīng)無凈改變。
2. 僅當(dāng)存儲過程發(fā)出begin tran語句時,才發(fā)出rollback tran。
5.5 其他注意事項
存儲過程應(yīng)該堅實可靠的,因為它們是駐留在服務(wù)器中,被頻繁使用的。應(yīng)仔細(xì)檢查參數(shù)的有效性,并在有問題時返回出錯信息。應(yīng)確保參數(shù)的數(shù)據(jù)類型和被比較的欄的數(shù)據(jù)類型匹配,從而避免數(shù)據(jù)類型匹配錯誤。在每個SQL語句之后要檢查@@error。
6 數(shù)據(jù)對象的國際化
6.1 關(guān)于數(shù)據(jù)對象的命名
數(shù)據(jù)對象和變量的命名一律采用英文字符。禁止使用中文命名。其他命名注意事項和規(guī)范請參考2命名規(guī)則。
6.2 關(guān)于RAISERROR
SQL SERVER 系統(tǒng)的RAISERROR命令能夠把某個出錯情況返回給調(diào)用過程,這對說明調(diào)用過程的執(zhí)行情況很有必要;同時可以部分避免客戶端的冗余操作。另外,結(jié)合系統(tǒng)存儲過程sp_addmessage和sp_dropmessage可以方便實現(xiàn)數(shù)據(jù)對象在SQL SERVER端的國際化。
SQL SERVER的MASTER數(shù)據(jù)庫中有錯誤信息數(shù)據(jù)表sysmessages,專門用于存儲系統(tǒng)和用戶的錯誤提示及相關(guān)信息(如錯誤ID號、錯誤等級、狀態(tài))。用戶可以調(diào)用sp_addmessage和sp_dropmessage預(yù)先將各類錯誤信息記入該數(shù)據(jù)表。其中,不同的錯誤信息用錯誤ID號區(qū)分。在編寫存儲過程代碼時,調(diào)用RAISERROR函數(shù)從錯誤信息表sysmessages中引用相關(guān)錯誤ID號的錯誤信息。
由于0~50000的值是保留為 SQL SERVER使用的,所以用戶自定義錯誤信息的錯誤ID號必須大于50000。
RAISERROR的語法如下:
RAISERROR ({msg_id | msg_str}, severity, state )
本規(guī)范建議存儲過程以RAISERROR和RETURN返回。
舉例如下:
l 第一步:生成該錯誤信息
/*insert a error message into the master..sysmessages*/
sp_addMessage 50001 ,16 ,‘Can"t update the primary key from table %s‘
l 第二步:執(zhí)行存儲過程sp_xxx,異常返回時引用上述錯誤信息
CREATE PROCEDURE sp_xxx
BEGIN
...
RAISERROR(50001 ,16 ,1 ,‘r_a‘) -- Can"t update the primary key from table r_a
ROLLBACK TRAN
RETURN(1)
END
l 第三步:在DELPHI調(diào)用中,通過EDBEngineError捕捉該錯誤
try
sp_test.execProc ;
except
on e :EDBEngineError
if e.errors[1].errorcode = 13059 then
/*hint ‘Can"t update the primary key from table r_a‘*/
showMessage(e.errors[1].message)
end ;
l 第四步:當(dāng)不再使用該錯誤信息時,應(yīng)該從錯誤信息表中刪除相應(yīng)數(shù)據(jù)
sp_dropMessage 50001
l 第五步:錯誤提示信息國際化
用相應(yīng)語言替換master..sysmessages表中用戶自定義的錯誤消息即可。