SQL.Server.設計、命名、編碼規(guī)范.doc_第1頁
SQL.Server.設計、命名、編碼規(guī)范.doc_第2頁
SQL.Server.設計、命名、編碼規(guī)范.doc_第3頁
SQL.Server.設計、命名、編碼規(guī)范.doc_第4頁
SQL.Server.設計、命名、編碼規(guī)范.doc_第5頁
已閱讀5頁,還剩36頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

SQL Server 設計、命名、編碼規(guī)范 SQL Server Database Design, Code and Development Standards 1.更改42.簡介43.開發(fā)環(huán)境53.1數(shù)據(jù)庫模型53.2 Diagrams53.3版本控制53.4 源碼目錄結構54.物理數(shù)據(jù)庫模型&字典64.1 物理數(shù)據(jù)模型64.2 IDEF1X 方法74.3 物理數(shù)據(jù)庫數(shù)據(jù)字典74.4 性能設計75命名協(xié)定85.1 數(shù)據(jù)庫命名原則及版本控制85.1.1數(shù)據(jù)庫命名原則85.1.2 數(shù)據(jù)庫版本控制85.2 Server/命名實例的命名85.3 數(shù)據(jù)庫命名95.4 數(shù)據(jù)庫對象表,視圖,列名,約束,規(guī)則,默認值115.5 縮寫規(guī)范125.6 列名125.7 存儲過程命名145.8 游標命名145.9 觸發(fā)器命名155.10 索引命名155.11 主鍵和外鍵命名155.12 Check約束命名165.13 源文件命名165.14 Job的命名165.15 用戶自定義函數(shù)命名175.16 用戶自定義數(shù)據(jù)類型命名175.17 復制命名176.SQL Server代碼規(guī)范176.1 對象創(chuàng)建腳本176.2 數(shù)據(jù)庫更改腳本196.3 綜合開發(fā)實踐226.4 文本文件格式236.5 使用Return326.6 錯誤處理336.6.1 在存儲過程和觸發(fā)器中使用RAISEERROR346.7 Print 語句346.8 參照完整性356.8.1 主鍵356.8.2 外鍵356.9 觸發(fā)器356.10 游標366.11 用戶自定義函數(shù)376.12 局部變量命名標準386.13 返回最后插入的標識值387.安全398.事務處理408.1 編寫高效的事務處理代碼408.2 批處理40附錄A:最常見的不應該出現(xiàn)的問題411.更改 Change Name Date 命名原則:表意性原則(增加) DavidDong Jan/05 數(shù)據(jù)庫命名 DavidDong Jan/05 表命名 DavidDong Jan/05 Server/Instance命名 DavidDong Jan/05 JOB,復制命名 DavidDong Jan/05 2.簡介 數(shù)據(jù)庫設計是指對于一個給定的應用環(huán)境,構造最優(yōu)的數(shù)據(jù)庫模式,建立數(shù)據(jù)庫及其應用系統(tǒng),有效存儲數(shù)據(jù),滿足用戶信息要求和處理要求 數(shù)據(jù)庫設計和開發(fā)標準是使Newegg Support Center的數(shù)據(jù)庫系統(tǒng)的設計和開發(fā)正式化的標準。通過此標準,來規(guī)范數(shù)據(jù)庫設計。 通過一致的系統(tǒng)解決方案,能給我們的系統(tǒng)帶來以下優(yōu)點: 開發(fā)出高可管理性的高質量系統(tǒng) 能夠快速的進行開發(fā) 減少維護代碼的時間 非常容易的把代碼從一個項目拷貝至另一個項目 節(jié)省把游標,錯誤處理信息從一個項目中拷貝到另一個項目中的時間 使程序邏輯簡單化 不用花費時間在常規(guī)的事情上,比如對象名稱轉換等,并可允許多次設計,編程和對復雜事件的測試工作 在代碼出錯時大大節(jié)省時間 只要在第一次是有個良好的設計 3.開發(fā)環(huán)境 3.1數(shù)據(jù)庫模型 CA公司的ERwin/SQL是數(shù)據(jù)建模的一個首選工具. 在開發(fā)經常改變的項目時,使用ERwin來生成表(創(chuàng)建/刪除),索引,規(guī)則,數(shù)據(jù)類型等數(shù)據(jù)庫對象的腳本,在對項目文件進行修改之前,請確認已經對這些腳本進行過備份. 任何數(shù)據(jù)庫的改變,不管是在開發(fā)中還是在產品服務器中,都要用ERwinDiagram中進行相應的修改.如果產品服務器上做出了更改,則一定要對主腳本和ERwin diagram進行相應更新. 3.2 Diagrams 使用Visio進行數(shù)據(jù)diagram,流程圖,服務器拓樸和其它diagrams進行設計.文檔化系統(tǒng)或者處理流程可以大大有利于團隊間的協(xié)作. 3.3版本控制 推薦使用Visual SourceSafe(VSS)對NESE數(shù)據(jù)庫對象進行管理. 在任何項目中,都應該有很好的代碼更改控制,初始版本文件應該放到VSS中并被注釋.所有對這些文件的后繼更改都應該放到VSS中管理. 3.4 源碼目錄結構 在項目剛開始時,找到一個所有Team成員都能夠訪問的共享.按照以下結構初始化VSS目錄和數(shù)據(jù)庫子目錄: CMD 包括全系統(tǒng)腳本的腳本文件,如果是一個多數(shù)據(jù)庫的系統(tǒng),應該有一個可能創(chuàng)建所有數(shù)據(jù)庫的命令文件. DBName 在系統(tǒng)中的每個數(shù)據(jù)庫應該有自己的目錄結構,如下: CMD:用來創(chuàng)建此數(shù)據(jù)庫的腳本文件,并且來更改數(shù)據(jù)庫構架. DAT:用來刷新此數(shù)據(jù)庫的數(shù)據(jù)文件. SP:用來存儲存儲過程的腳本 TBL:除了下面子目錄,這個目錄應該包括表的定義腳本,每個表應該有它自己的腳本,此腳本應該包括經表的刪除,創(chuàng)建語句,索引,觸發(fā)器,完整性參照,Check約束,默認值約束等,每個表創(chuàng)建語句應該包括在不同的腳本中,并被把歸類到類似于下面的相應的子目錄中.注意:本目錄中的腳本和以下子目錄的腳本應該命名為它所影響的表名,比如:表名.sql: Check:為每個表創(chuàng)建獨立的Check約束定義腳本,Check約束應該使用alter table add constraint 來創(chuàng)建,并且每個alter table 語句只能包括一個contraint。 DEFAULT:為每個表創(chuàng)建單獨的Default約束定義腳本。注意這些是Default Constraints,而不是在創(chuàng)建表時的Default。 FK:為每個表創(chuàng)建單獨的外鍵約束定義腳本。 Index:為每個表創(chuàng)建一個索引定義腳本,并把對應索引定義腳本放進去. PK:為每個表創(chuàng)建單獨的主鍵定義腳本 TRG:為每個表創(chuàng)建單獨的觸發(fā)器定義腳本,并把應用到此表上的觸發(fā)器放進此腳本文件中。 UDF:用戶自定義函數(shù)。 View:視圖定義腳本。 DCL: 數(shù)據(jù)控制語句腳本主要包括控制所有的數(shù)據(jù)庫對象的Grant 和 Revoke語句。 MISC:這兒用于存放各式各樣的其它腳本,例如alter table腳本或者一次更改的腳本,注意,不要放此目錄看成是一個包羅各種腳本的容器,只應包括需要放到VSS中,但是又不屬于上面所列目錄的腳本。 4.物理數(shù)據(jù)庫模型&字典 E-R 圖表和數(shù)據(jù)字典可以讓任何使用數(shù)據(jù)庫的人都明確的知道如何從數(shù)據(jù)庫中獲得數(shù)據(jù)。E-R圖對表明表之間關系很有用,而數(shù)據(jù)字典則說明了每個字段的用途以及任何可能存在的別名 4.1 物理數(shù)據(jù)模型 物理模型圖形化的展現(xiàn)數(shù)據(jù)庫的實現(xiàn),它由邏輯數(shù)據(jù)模型及底層關系型數(shù)據(jù)庫管理系統(tǒng)來決定,由邏輯模型轉變?yōu)槲锢砟P桶ㄒ韵碌娜蝿眨?為實體和屬性創(chuàng)建合理的數(shù)據(jù)庫名字 為每個屬性設計數(shù)據(jù)類型和是否允許為空 定義主鍵,外鍵和索引 定義規(guī)則和默認值 為優(yōu)化性能,盡可能使數(shù)據(jù)庫設計規(guī)范化,比如遵循1NF(第一范式),2NF(第二范式) 和3NF(第三范式) 為加快數(shù)據(jù)庫設計速度,目前有很多數(shù)據(jù)庫輔助工具(CASE工具),如Rational公司的Rational Rose,CA公司的Erwin, Sybase公司的Power Designer以及Oracle公司的Oracle Designer等。 ERwin主要用來建立數(shù)據(jù)庫的概念模型和物理模型。它能用圖形化的方式,描述出實體、聯(lián)系及實體的屬性。ERwin支持IDEF1X方法。通過使用ERwin建模工具自動生成、更改和分析IDEF1X模型,不僅能得到優(yōu)秀的業(yè)務功能和數(shù)據(jù)需求模型,而且可以實現(xiàn)從IDEF1X模型到數(shù)據(jù)庫物理設計的轉變。ERwin工具繪制的模型對應于邏輯模型和物理模型兩種。在邏輯模型中,IDEF1X工具箱可以方便地用圖形化的方式構建和繪制實體聯(lián)系及實體的屬性。在物理模型中,ERwin可以定義對應的表、列,并可針對各種數(shù)據(jù)庫管理系統(tǒng)自動轉換為適當?shù)念愋汀?設計人員可根據(jù)需要選用相應的數(shù)據(jù)庫設計建模工具。例如需求分析完成之后,設計人員可以使用Erwin畫ER圖,將ER圖轉換為關系數(shù)據(jù)模型,生成數(shù)據(jù)庫結構;畫數(shù)據(jù)流圖,生成應用程序。 ERwin是現(xiàn)在被廣泛使用的數(shù)據(jù)模型設計軟件,IDEF1X用來建立信息模型的標準。物理模型基于邏輯模型,ERwin同時支持邏輯模型和物理模型視圖的設計。同時,ERwin可以產生所有的用來創(chuàng)建數(shù)據(jù)庫的DDL腳本. 4.2 IDEF1X 方法 下面的關系圖描述最常用的IDEF1X表達式協(xié)定: 4.3 物理數(shù)據(jù)庫數(shù)據(jù)字典 使用ERwin來對物理數(shù)據(jù)庫數(shù)據(jù)字典進行維護。在屬性定義編輯器中輸入屬性定義 。然后你就可以從ERwin中生成報表,把它們放到word 文檔中,在屬性報表中,將包括屬性名字,數(shù)據(jù)類型,Null/Not Null和主/外鍵選項。把實體和屬性定義放到一個一個文檔中是很困難的,所以在不同的報表中創(chuàng)建它們. 4.4 性能設計 作為一個常規(guī)的規(guī)則,在一個具有標識列(identity property)的列上定義一個主鍵。這使與之存在關系的表有一個窄的行寬,從而使同一數(shù)據(jù)頁中能被存儲更多的數(shù)據(jù)行,因此相同條件下將會有更少的描描操作。 定義聚集主鍵,這將會使二級索引占用較少空間。 在外鍵上創(chuàng)建索引。 不要使用過多的索引,要確認你知道哪個索引將被使用。 確認對應表存在統(tǒng)計信息。同時在數(shù)據(jù)庫中打開Auto Generate Stats 和 Auto create stats 選項。在一個只讀的數(shù)據(jù)庫中,我們可能需要手動的創(chuàng)建統(tǒng)計信息. 在一個只讀的數(shù)據(jù)庫或者是很少被更改的數(shù)據(jù)庫中使用100%的索引填充率。 SELECT語句中,在非事務和特別的完整性要求的上下文中,要使用Table HintsWITH NOLOCK 5命名協(xié)定 5.1 數(shù)據(jù)庫命名原則及版本控制 5.1.1數(shù)據(jù)庫命名原則 數(shù)據(jù)庫命名要遵從以下命名原則: 表意性原則:數(shù)據(jù)庫命名本著表意性原則,即命名應盡量反映存儲/action/view/column的數(shù)據(jù)內容。 長名原則:很少使用或者不使用縮寫,適用于DB命名之外的任一對象 數(shù)目最少化原則:數(shù)據(jù)庫對象應該盡量滿足數(shù)據(jù)最小化原則,也就是數(shù)據(jù)庫數(shù)目,存儲過程,視圖等數(shù)量最小化。 5.1.2 數(shù)據(jù)庫版本控制 當由于多個版本的應用系統(tǒng)同時存在或者是其它特殊原因而使用完成相似的功能的對象存在同時存在時,使用版本控制:版本號在對象名的后面加上_v1 如: Up_IM_DailyUsageStatsUpdate_v2 Up_IM_CustomerGetUsingLastName_v2 5.2 Server/命名實例的命名 基于Domain命名, DOMAIN 的粒度,可分為三級 ,分別是Server級別,Database級別和表的前綴級別。此為第一級別。 1 ONLINE PRODUCTION SERVER NEWSQL NEWSQL2 EHISSQL WAREHOUSE PRODUCTION SERVER S3SQL01 S4SQL01 S7SQL01 S6SQL01 5.3 數(shù)據(jù)庫命名 數(shù)據(jù)庫命名應當遵從上面所提及到的協(xié)定,包括沒有特殊的字符,使用文字數(shù)據(jù)字式字符.,項目代碼命名不應該同樣被數(shù)據(jù)庫使用.數(shù)據(jù)庫名字應該唯一以避免沖突等.以Domain來標識, 拆分DATABASE,基于大的邏輯范疇,如operation 范疇以及部門類別,另外:其它與部門相關的DATABASE 可以放到相關的SERVER 下。 數(shù)據(jù)庫數(shù)目最少化原則 數(shù)據(jù)設置盡可能MERGER原則 peration database AND Dept level Database set up rules 拆分DATABASE,基于大的邏輯范疇,如operation 范疇以及部門類別 其它與部門相關的DATABASE 可以放到相關的SERVER 下。 下面為與OPEARATION 相關的DATABASE示例: 如: 下面為與OPEARATION 相關的DATABASE: ItemProfile Inventory Codecenter CustomerProfile SalesOrder Accounting Sevice(RAM) eCommerce SupplerChainManagement DropShip SerialNumber WorkFlow ShippingCarrier WarehouseManagment HumanResource 其它與部門相關的DATABASE 可以放到相關的SERVER 下。 MKT Pm Mis CUSTOMER SVR ADMIN ACCOUNTING 2. INTERNAL DEPT DATABASE SERVER 5.4 數(shù)據(jù)庫對象表,視圖,列名,約束,規(guī)則,默認值 數(shù)據(jù)庫對象應該被清晰的命名,要確認不存在歧義。數(shù)據(jù)庫對象的名字應該包括自己盡可能多的信息,并要詳細的說明與之相對應的項目文檔.選擇合適的命名空間是一個很讓人困惑的問題(比如我們不能從一個存儲過程的命名上看到是哪個項目在使用這個對象),命名名字唯一的在數(shù)據(jù)庫級別標識自己,無論在哪兒使用它,請確保在一個項目中命名方法的一致.在一個小的上下文看來很清晰的對象在一個大的上下文中可能就會丟失他的含義.節(jié)省擊鍵次數(shù)永遠不能用來作選擇名字的標準. 下面供述了數(shù)據(jù)庫對象的命名協(xié)定,所有的數(shù)據(jù)庫對象命名都應該遵循下面協(xié)定. 如果不是長度限制,縮寫應該被避免.當使用縮寫時應該遵從下面的縮寫規(guī)范的規(guī)則.縮寫應該在項目范圍內保持一致并被存檔. 不要使用特殊的字符;對文字數(shù)字式字符加以限制. 在命名時為了更好的標識表與應用程序之間的關系,我們要使用“function name|main module name表名”的形式. 比如: Newegg_customer Blocked_customer Abs_customer EDI_. MDF_. 當要修改一個對象的架構時,首先要確認與之存在依存關系的對象不受影響.要查看與之存在依存關系的對象,可以在企業(yè)管理器中”右鍵相應對象”-”ALL TASKS”-”DISPLAY DEPENDENCIES”來查看或者使用系統(tǒng)存儲過程SP_DEPENDS來查看: EXEC SP_DEPENDS dbo.GetCategories 當?shù)讓颖斫Y構更改時,視圖都應該被重新創(chuàng)建.這個應該特別被注意,特別是視圖是使用如”SELECT * FROM table”時. 強烈建議任何時候都不要使用類似于”SELECT * FROM”的語句. 當在不存在事務上下文中或者是完整性要求不是很高時,在SELECT語句中使用WITH NOLOCK. 5.5 縮寫規(guī)范 由于長度的限制而需要使用縮寫時,應當遵從以下的規(guī)則: 以分類單詞作為名字的起始. 縮寫的第一個字符應該與單詞的第一個字母相同,比如,SFER就不是Transfer的有效縮寫. Identify and abbreviate the root word, usually the shortest form of the word. 縮寫時省略元音字符,除非特殊原因,重復字符中將被省略一個。 縮寫不應該暗示到其它的單詞(比如:單詞“parent”可能被縮寫為”PRNT”,但是“PRNT”很容易讓人想起單詞“PRINT”,一個比較好的縮寫就是使用”PSRNT”) 相似單詞的縮寫應該一致,比如如果Charge縮寫為CHRG,則change應該被縮寫為CHNG. 當組合詞或者短語被廣泛使用時,并且大多人都能識別出這些縮寫時,應該使用他們的首字母縮寫,因為大多人都能識別出這些縮寫。 5.6 列名 列名應該基于邏輯設計中的屬性名, 修飾符: 可選,它以角色名而被大家所熟知(PrimaryPartID, AlternatePartID) 主詞(primary word): 除非是主鍵,否則不需要。因為表名已經限定列名,所以不必要冗余的加入此信息。 限定詞: 可選;附加的描述信息,用來幫助我們更明確的了解數(shù)據(jù)的意義(InventoryOnHandQuantity, CustomerLastName) 分類詞: 需要;用來標識數(shù)據(jù)的類型,一般列名的最后一個單詞(PartID, CountryCode, CustomerName, InvoiceAmount). 下面是一些標準的分類詞: CLASSIFIER DESCRIPTION Address Street or mailing address data Age Chronological age in years Average A numerical average (self-explanatory) Amount Currency amount - always is money Code Code from a specific domain of coded values Count Count of something - years, payments, etc. Date Calendar date Datetime Date including time Day Day of month (1 - 31) Description Brief narrative description (usually of a code) Duration Span of time, whether days, months, years, etc. Identifier Unique identifier for something Image A graphic image, such as a bitmap Indicator A boolean indicator Measurement Measurement of physical dimensions Month Month of year Name Formal name of something Number Number (self-explanatory) Percent Number expressed as a percent Quantity a number of things Rate Number expressed as a rate Ratio A proportion, or expression of relationship in quantity, size, amount, etc. between two things Text Freeform textual information Time Time of day Weight Weight measurement Year Calendar year or julian year number 下面的ERwin diagram 示例推薦的命名協(xié)定: 5.7 存儲過程命名 存儲過程命名使用上面描述的表,視圖和列的命名一樣的規(guī)則,包括不要使用特殊的字符,大寫首詞,不要使用組名(比如,myProc1),不要使用系統(tǒng)保留的“sp_”前綴(比如可以使用up_),使用文字數(shù)據(jù)式字符,為了使存儲過程名字更有意義,名字中應包括“對象”“動作”的方式 。 存儲過程命名示例: Up_IM_CustomerGet(IM 標識itemmaintain系統(tǒng)使用) Up_IM_LoginValidate Up_IM_RegionDataRotate Up_IM_DailyUsageStatsUpdate Up_IM_CustomerGetUsingLastName 下面是可選的命名規(guī)則,使用“動作”“對象”的方式: Up_IM_BuildSalesPerspectives Up_IM_InsertSellInFileAudit 5.8 游標命名 游標應該以下面的標準來命名: 表名或者對象名字使用此游標的對象名字+Cursor 例如: FiscalMonthCURSOR EmployeeListCURSOR 5.9 觸發(fā)器命名 觸發(fā)器命名應該遵從以下的協(xié)定: 表名+ Ins | Upd | Del Ins標識此觸發(fā)器為insert觸發(fā)器,UPD標識此觸發(fā)器為update觸發(fā)器,同理DEL被用來標識delete觸發(fā)器: 觸發(fā)器示例: CustomerIns ProductCodeDel BusinessUnitUpd 5.10 索引命名 索引的命名應該在表空間內唯一,當查看執(zhí)行計劃時可以有效的對索引進行識別. IX類型(U標識Unique,C標識Clustered)列名(s) 當對單列進行索引時,你可能需要使用列的全名. 當對多列進行索引時,要使用你所能想到的最優(yōu)的縮寫. 當對一個表的所有列進行索引時,使用ALL單詞. 在多列名中使用下劃線以增加可讀性. 不要為索引加上序列號 例如: IXUC_SalesId (clustered unique) IXU_SalesDate (unique) IX_SalesId_MonId_QtrId_WkId (composite index) IX_MonId_YrId (composite index) IXC_SalesId (clustered not unique) 5.11 主鍵和外鍵命名 主鍵:對主鍵進行命名應該遵從以下標準: PK_表名 例如,主鍵名 PK_Customer 外鍵:對外鍵進行命名時應該遵從以下標準: ChildTableName_FK_ParentTableName 外鍵名字示例: Customer_FK_Country Sales_FK_Customer 5.12 Check約束命名 Check約束的命名遵從以下的約定: 表名CK數(shù)字 數(shù)字被用來區(qū)別同一表中的其它Check約束. Check約束命名示例: CustomerCK1 5.13 源文件命名 文件命名應該使用和數(shù)據(jù)庫對象命名相同的規(guī)則包括沒有特殊字符,限制名字以避免歧義,大寫每個單詞的首字符,所有的包括SQL腳本的文件應該以.SQL為結束字符,而不是.SP,.TRG等??蓤?zhí)行的批處理文件應該是以.CMD為擴展名. 5.14 Job的命名 Job命名使用以下方式,其中在” Job名”中要標識出此JOB的功能: Job_應用系統(tǒng)名_數(shù)據(jù)庫名_Job名/ storce procedure名 For Example: Job_IM_IMDB_backup 5.15 用戶自定義函數(shù)命名 滿足NESE命名的基本原則 用戶定義的函數(shù)使用fn來標識 名字中應包括“對象”“動作”的方式 For example: Un_IM_CustomerGet(IM 標識itemmaintain系統(tǒng)使用) 5.16 用戶自定義數(shù)據(jù)類型命名 滿足NESE命名的基本原則 用戶定義的函數(shù)使用Udt來標識 用戶定義的數(shù)據(jù)類型 如: UdtPhone UdtBirthday UdtAge 5.17 復制命名 在滿足NESE命名的基本原則利用Rp來標識復制 Rp_DBname復制名_Trn|Mrg|Snp Trn:標識為Transactional Publication Mrg:Merge Publication Snp:Snapshot publication 如: Rp_Foodmart_Trn 6.SQL Server代碼規(guī)范 6.1 對象創(chuàng)建腳本 使用數(shù)據(jù)庫(USE) 不要在SQL Server源文件使用USE 數(shù)據(jù)庫名語句,這會導致只能在此數(shù)據(jù)庫創(chuàng)建對象,OSQL命令行工具可以在數(shù)據(jù)庫中重定向. 刪除對象: IF Exists語句應該在Drop 對象語句之前執(zhí)行: IF object_id(tablename) IS NOT NULL DROP TABLE TableName 表創(chuàng)建,索引,觸發(fā)器 在開發(fā)過程中,所有的表創(chuàng)建腳本都可以合并為一個項目中的文檔中(使用ERwin將會非常將會非常容易).此文檔中每個表創(chuàng)建語句的后面應該有Go語句,當系統(tǒng)到達一個穩(wěn)定點時,應該把文檔中的從多個表按照表的不同分到單獨的文件以利于維護.這此文檔應該放到TBL子目錄下. 在每個創(chuàng)建單獨表的文檔中,都應該在創(chuàng)建表語句的前面使用if exists() drop table 語句. 每表創(chuàng)建單獨的索引腳本文件,并把它們放到TBL的子目錄INDEX下,命名為.SQL.在每個創(chuàng)建索引的語句之前,應該使用”if exists() drop”語句,這樣當此索引 已經存在時,它將會被先刪除然后重新創(chuàng)建. 如果必要,創(chuàng)建單獨的觸發(fā)器腳本,并把它放置在TBL的子目錄 TRG下.也命名為.SQL. 主鍵,外鍵,Check約束和默認值 所有的約束和默認值定義都應該直接通過ALTER TABLE命令來創(chuàng)建,在創(chuàng)建表的同時對約束和默認值進行嵌入式的定義應該被禁止,為了清晰起見.一個ALTER TABLE語句不應該包括多個對表的更改,我們推薦在每個更改語句之前使用“if exists() alter . Drop onstraint”,這樣當此約束已經存在時,可以被重新創(chuàng)建。 主鍵定義有單獨的腳本,并放置在TBL的子目錄PK下。 外鍵定義也應該有獨立的腳本,并放置與TBL的子目錄FK下。 每個表的Check約束語句也應該放在一個單獨的目錄TBL的子目錄CHECK之下。 表中列的默認值定義應該放在一個獨立的腳本,并放置與TBL的子目錄DEFAULT之下。 在CREATE TABLE 中顯式的為表的每一列定義是否為空,不要依靠數(shù)據(jù)庫的默認設定,因為在數(shù)據(jù)庫中這可能不同,從而出現(xiàn)了無意識的錯誤。 為索引和主鍵指定CLUSTERED或者NONCLUSTERED,不要依靠數(shù)據(jù)庫的默認設定。 Grant 語句 .Grant語句應該獨立與表,存儲過程等的創(chuàng)建語句,為Grant語句創(chuàng)建單獨的文件可以使我們很容易的重新對數(shù)據(jù)庫對象進行授權。 6.2 數(shù)據(jù)庫更改腳本 當在產品服務器上對數(shù)據(jù)庫進行更改時,要非常小心和注意.這會避免產品服務庫發(fā)生丟失數(shù)據(jù)或者停止服務等災難的發(fā)生. 這個腳本應該是可以對數(shù)據(jù)庫的對象進行判斷的,比如,如果一個對象已經存在,那應該成功結束,而不是把此對象刪除,因為此對象可能已經包括數(shù)據(jù).比如表,如果要刪除一個已經存在的表,則也刪除了表中的數(shù)據(jù). 當表或者視圖重新被創(chuàng)建時,也要重新創(chuàng)建授權. 任何時候,當表被創(chuàng)建或者被重新創(chuàng)建時,確認所有的依靠關系,比如PK,FK,索引,觸發(fā)器,默認值和視圖都應該對重新創(chuàng)建. 當?shù)讓颖斫Y構更改時,視圖都應該被重新創(chuàng)建.這個應該特別被注意,特別是視圖是使用如”Select * from table”時. 如果一個表被復制,在SQL Server 2000使用sp_repladdcoumn和sp_ repldropcolumn存儲過程. 腳本包括錯誤檢測及事務的回滾.當把一個表分成兩個表或者是多個復雜的輪換時,這個就很重要. 在腳本中應該包括Raiserror腳本,這樣會使以后的打錯工作較為容易.理想情況下,應該首先使用Raiserror(msg,0.1) WITH NOWAIT,因為這樣當它被執(zhí)行時會被送到客戶端。 DECLARE rows int, rc int SET NOCOUNT ON IF NOT EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME = AgreementDurationID AND TABLE_NAME = BudgetSellIn) BEGIN IF EXISTS (SELECT * FROM sysobjects WHERE name =BudgetSellIn AND xtype = u AND replinfo in (1,3) BEGIN EXEC rc = sp_repladdcolumn source_object = BudgetSellIn ,column = AgreementDurationID ,typetext = int NOT NULL CONSTRAINT DF_BudgetSellIn_AgreementDuID DEFAULT 0 IF rc 0 BEGIN RAISERROR(Failed adding column AgreementDurationID to BudgetSellIn., 0,1) WITH NOWAIT GOTO CRASH END - Drop the default constraint ALTER TABLE BudgetSellIn DROP CONSTRAINT DF_BudgetSellIn_AgreementDuID IF ERROR 0 BEGIN RAISERROR(Failed droping DEFAULT CONSTRAINT DF_BudgetSellIn_AgreementDuID from BudgetSellIn., 0,1) WITH NOWAIT GOTO CRASH END RAISERROR(Successfully added column AgreementDurationID to BudgetSellIn.,0,1) WITH NOWAIT END END ELSE RAISERROR(New Column AgreementDurationID already exists in BudgetSellIn.,0,1) WITH NOWAIT IF NOT EXISTS(SELECT * FROM sysobjects WHERE name = BudgetSellIn_FK_AgreementDuration and type = f) BEGIN ALTER TABLE BudgetSellIn ADD CONSTRAINT BudgetSellIn_FK_AgreementDuration FOREIGN KEY (AgreementDurationID) REFERENCES AgreementDuration(AgreementDurationID) IF ERROR 0 BEGIN RAISERROR(Failed Adding FOREIGN KEY To AgreementDuration., 0,1) WITH NOWAIT GOTO CRASH END RAISERROR(Successfully added FOREIGN KEY To AgreementDuration., 0,1) WITH NOWAIT ELSE RAISERROR(FOREIGN KEY to AgreementDuration Already exists on Table BudgetSellIn.,0,1) WITH NOWAIT END GOTO VERYEND CRASH: RAISERROR (Error Adding New Columns to BudgetSellIn., 18,127) VERYEND: 6.3 綜合開發(fā)實踐 不要在存儲過程中使用輸入參數(shù)來更改它們的功能。這樣會使程序中的耦合度大大增加。例如,一個存儲過程根據(jù)輸入參數(shù)向Customer表中插入記錄或者Employee表中插入記錄,這會使此存儲過程復雜化和松耦合度,此時使用兩個獨立的存儲過程(一個存儲過程實現(xiàn)向Customer表插入記錄和一個實現(xiàn)向Employee表插入記錄)將會更好. 不要使用關鍵字作為對象的標識. 使用ANSI風格的連接。不要使用老的TSQL 外連接“*=”,這可能在將來的版本中不被支持. 不要在存儲過程中使用雙引號,這是因為ANSI標準中默認就是QUOTED_IDENTIFIERS是設置為ON的,所以SQL Server將視任何雙引號之內的字符為標識符. 當調用存在參數(shù)的存儲過程時,一個比較的好建議就是使用參數(shù)名和參數(shù)值來傳遞,而不是依次使用參數(shù)值來調用。 為了清晰起見,its often a good practice to specifically include the correct parameters. For example: 當創(chuàng)建索引時,不管是否是cluster,都要明確的使用它 當創(chuàng)建在一個具有Identity屬性列的表時,應該包括起始數(shù)字和增加數(shù)字,也要包括是否為空。如: Create table Table1 (ColA int identity(1,1), colB varchar not null). 我們都知道應該盡是避免硬編碼,但是必要時,增加注釋來說明硬編碼的意義,例如: “where SalesChannelLevelID = 1 SellInsales” 當使用RPC調用一個存儲過程時,在服務器名字上加上中括號,比如,一個服務器的名字可能叫“FridgeInst1”,如果不加中括號,將會出錯. INSERT INTO #CMODSSourcePROHistory EXECUTE(+ServerName +.CMODS.dbo.RSPGetSourcePROHistory) 6.4 文本文件格式 保持單行字符少于87個 每行SQL語句的寬度應該少于87個字符,如果太寬,我們在查看和打印時易讀性會很差。 縮進間距 在TSQL文件中,使用3個字符的縮進,我們可以在查詢分析器中配置Tab鍵為3個空格的縮進(默認為8),如下示例所示: IF EXISTS (SELECT . FROM Table .) BEGIN statement 1 statement 2 IF (.) BEGIN statement 1 END END - end of if table rows exist SQL代碼格式化 保證代碼在項目范圍內的一致性。為所有的代碼段使用相同的格式和縮進方式. 大寫所有的關鍵字,并

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論