Sql-Server

如何從大型 ER 模型中選擇數據子集?

  • August 11, 2016

我的數據庫中有一個相當大的 ER 模型和大量數據。現在我想將這些數據的一個子集放入不同的數據庫中以進行測試。問題是如何從所有表中獲取一個子集,這樣我就不會破壞參照完整性並從數據庫中獲取孤立記錄?我的意思是,如果我選擇 100 條記錄,例如從“產品”表中,我怎樣才能輕鬆地從引用的表中獲取所有數據(以及從引用這些表的表中)?是否有任何工具可用於此目的或只是純 SQL?

不幸的是,沒有一種千篇一律的方法可以做到這一點。您必須從一些基本記錄開始,編寫加入它們的查詢,然後重複。隨著您深入,查詢變得更加複雜,因為它們必須直接回到根。

如果您有外鍵,那麼您可以自動生成查詢,因為連接將只是通過外鍵列。這並不像聽起來那麼難,但如果你採用這種方法,這裡有一些提示:

  • 查詢只會在其葉子中檢索表的內容,因此它們的生成相當簡單。
  • 以將通過 bcp 載入的形式獲取數據。作為獎勵,您可以從系統元數據生成 bcp 控製文件。
  • 您可能可以非常安全地複制所有參考數據,無論如何這可能佔您表的大部分。
  • 您可能必須從多個根開始,如果缺少外鍵,您可能必須手動添加連接元數據。如果您與葉表的關係不是純粹的分層關係,那麼您可能必須手動編輯生成器的元數據。實際上,這意味著您可能希望從系統數據字典開始,然後為您的生成器創建一個配置文件來解決這個問題。
  • 如果選擇條件涉及到記錄的多個路徑,您可能還需要為某些數據項添加自定義查詢。
  • 生成或編寫使用 bcp 以正確順序將表載入到目標的腳本。

通過一些手動干預,自動化可能會讓你完成 95% 的工作,而且腳本編寫起來也不是那麼難。這不是一個 5 分鐘的工作,但它肯定是可能的。

您可以以程式方式生成 SSIS 包來進行載入,但我認為生成 bcp 控製文件可能更容易。另一種選擇是僅建構腳本,以便將查詢中的數據複製到另一個影子數據庫中。然後可以將其備份/恢復到您想要的任何位置。

這不是一項微不足道的工作,但肯定不會超出人類的智慧。作為獎勵,如果您可以配置腳本以便可以參數化起始鍵,那麼您可以製作通用實用程序來複製應用程序數據庫的子集。這對於推出測試環境非常有用。

引用自:https://dba.stackexchange.com/questions/10094