翻譯|使用教程|編輯:莫成敏|2019-10-12 13:15:17.793|閱讀 413 次
概述:本教程演示了SQL Prompt如何顯著地減少偶爾出現的“重量級”數據庫重構過程所帶來的痛苦,例如重命名模塊、表和列(智能重命名)或拆分表(拆分表)。本文是該教程的下半部分內容——拆分表。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關鏈接:
SQL Prompt根據數據庫的對象名稱、語法和代碼片段自動進行檢索,為用戶提供合適的代碼選擇。自動腳本設置使代碼簡單易讀--當開發者不大熟悉腳本時尤其有用。SQL Prompt安裝即可使用,能大幅提高編碼效率。此外,用戶還可根據需要進行自定義,使之以預想的方式工作。
本教程演示了SQL Prompt如何顯著地減少偶爾出現的“重量級”數據庫重構過程所帶來的痛苦,例如重命名模塊、表和列(智能重命名)或拆分表(拆分表)。前面小編介紹了教程上半部分內容“智能重命名”,現在主要介紹后半部分內容——拆分表~
拆分表
通過在SSMS對象資源管理器中選擇一個對象,SQL Prompt的“拆分表”向導旨在生成一個腳本,該腳本創建鏈接表、修改原始表以及修改引用主表的任何對象。檢查腳本后,您可以執行它。SQL Prompt將所有更改包裝在一個事務中,因此可以將它們回滾以防萬一發生任何錯誤。
您將不需要將現有表一分為二,也不必冒著被破壞的風險,但是當您這樣做時,SQL Prompt的“拆分表”功能可以節省大量時間和精力。我考慮這樣做的主要原因是出于性能原因,“隔離”現有表中的非常大的列,但有時只是為了方便起見。
例如,假設我們要向Purchasing.ThePurchaseOrders表中添加系統版本控制。我們只想將版本歷史記錄保留在該OrderDate2列中。實際上,即使我們想對表格的大部分內容進行版本控制,也可能不想在兩個nvarchar(max)列上保留歷史記錄,因為每次更新都會創建一個新的文本副本,副本最多可包含2GB的文本。
因此,我們的目標是將OrderDate2列移出ThePurchaseOrders表并移到新表中,然后可以對其應用系統版本控制。右鍵單擊ThePurchaseOrders表,選擇“拆分表”,將出現向導。為新的輔助表命名,如ThePurchaseOrdersTemporal,然后在下一個屏幕上,將復制鍵PurchaseOrderId,然后將OrderDate2移動到新表中,如圖5所示。兩個表都將具有主鍵,因此不能有重復的行在兩個表中。
圖5
下一個屏幕將要求您創建一個外鍵,該外鍵確定了將數據插入這些表的順序。
圖6
這樣可確保添加到Purchasing.ThePurchaseOrders表中的任何行都引用的PurchaseOrderID列中的現有值Purchasing.ThePurchaseOrdersTemporal。
單擊“下一步”,您將看到有關將要執行的操作,所做更改的依賴性以及與所需操作有關的所有警告的信息。在這種情況下,我們會看到警告,它不能處理非標準文件組,也不能保證在從父表中刪除列時不能自動保留數據(盡管在這種情況下,生成的腳本會將您的數據保存在新表中)。
圖7
當然,您總是希望檢查和微調這些生成的腳本之一。SQL Prompt可能不會每次都正確。您需要確保該工具所做的更改符合您計劃使用數據的方式。例如,該OrderDate2列定義為NOT NULL。但是,既然該列在相關表中,則該列在技術上可以為空,因為您不能強制使用1-1關系。
單擊查看腳本按鈕將使該工具生成一個腳本,您可以使用該腳本來應用更改。它將創建新表及其主鍵,將數據加載到新創建的表中,從原始表中刪除該列,更改所有相關對象,添加FOREIGN KEY并最終在新表的列上建立擴展屬性。
將更改所有從屬對象以解決新的架構設計。 例如,修改了PurchaseOrder $ ListAll過程以替換對Purchasing.ThePurchaseOrders的引用,并在Purchasing.ThePurchaseOrders和Purchasing.ThePurchaseOrdersTemporal之間使用INNER JOIN進行替換,如清單7所示。
這是INNER JOIN因為期望這兩行都是必需的,因為它們將一起成為表的一部分。即使您只選擇了允許NULL值的列也是如此(您可能不希望如此,因此請單獨檢查每種情況并相應地更改代碼)。
ALTER PROCEDURE Purchasing.[PurchaseOrder$ListAll] ( @IsOrderFinalized bit ) AS BEGIN SELECT ThePurchaseOrders.PurchaseOrderID, ThePurchaseOrdersTemporal.OrderDate, ThePurchaseOrders.IsOrderFinalized FROM <strong>(Purchasing.ThePurchaseOrders INNER JOIN </strong> <strong> Purchasing.ThePurchaseOrdersTemporal ON </strong> <strong> ThePurchaseOrders.purchaseorderid=</strong> <strong> ThePurchaseOrdersTemporal.purchaseorderid)</strong> WHERE IsOrderFinalized = @IsOrderFinalized; END;
清單7
與修改表并可能發生數據丟失的任何過程一樣,強烈建議您檢查生成的腳本,并在數據庫結構的副本上至少測試一次部署,如果腳本中的內容有誤,請進行備份。一旦完全滿意,就可以運行腳本,然后將時間擴展應用于Purchasing.ThePurchaseOrdersTemporal表,而不是原始表。
最后提醒您測試您的代碼,并確保所有代碼在SQL Server對象和用戶界面中均按預期工作。您正在極大地改變對象與外界的接口。
結論
在本教程中,我們研究了SQL Prompt中兩個最少使用的功能,但是在您需要它們時它們是無價的。如果您必須重命名對象或列,甚至將一個表拆分為兩個表,毫無疑問,智能重命名和拆分表功能可以為您節省大量時間,特別是如果您已實現SQL Server使用以服務器為中心的范例的數據庫,其中包含約束、觸發器和存儲過程。
您可以用更少的精力來進行大規模的名稱和結構更改,這意味著您可以投入更多的時間和精力來測試應用程序在重構后將繼續按預期正常運行。
本教程內容到這里就完結啦,感興趣的朋友可以繼續關注我們后續內容哦~也可以下載SQL Prompt試用版體驗一下~
相關內容推薦:
SQL語法提示工具SQL Prompt教程:使用SQL Prompt重構數據庫(下)
想要購買SQL Prompt正版授權,或了解更多產品信息請點擊
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn