2009-02-11 62 views
2

我想在我的項目上設置一些可靠的測試,我希望這樣做的方式是有一個我可以運行的命令行程序,它只複製數據庫的結構而不是實際的數據。然後我可以在新的數據庫上運行我的測試。如何以編程方式克隆SQL Server中的數據庫模式?

想法?

更新:有人說我應該指定一種語言。如果Sql Server運行,那麼我認爲TSQL是這樣的,腳本應該運行。此外,它是SQL Server 2005.

+0

你應該指定一種語言來獲得更好的答案 – 2009-02-11 22:14:08

回答

0

不幸的是,我們發現的最自動的過程實際上是使用其中一種鼠標控制工具來實際使用SSMS來複制數據庫。我會更願意做其他事情,但沒有一個答案實際上符合我們的要求。

0
+0

嗯,這個問題是不能做的第一個,因爲我們沒有數據庫腳本,第二個是不可行的自動化。 – 2009-02-11 22:29:47

3

你不說你正在使用的SQL Server版本,如果2005年看DMO - 數據庫管理對象,一組COM庫,可讓您訪問Enterprise Manager/Management Studio中的功能。

對於2008年我們有SMO類似的功能,但作爲.Net程序集,MS有一些good code examples。他們的腳本例子看起來像你需要啥子: -

從他們的網站解禁,我們有

//Connect to the local, default instance of SQL Server. 
{ 
    Server srv = default(Server); 
    srv = new Server(); 
    //Reference the AdventureWorks database. 
    Database db = default(Database); 
    db = srv.Databases("AdventureWorks"); 

    //Define a Scripter object and set the required scripting options. 
    Scripter scrp = default(Scripter); 
    scrp = new Scripter(srv); 
    scrp.Options.ScriptDrops = false; 
    scrp.Options.WithDependencies = true; 

    //Iterate through the tables in database and script each one. Display the script. 
    //Note that the StringCollection type needs the System.Collections.Specialized namespace to be included. 
    Table tb = default(Table); 
    Urn[] smoObjects = new Urn[2]; 
    foreach (tb in db.Tables) { 
     smoObjects = new Urn[1]; 
     smoObjects(0) = tb.Urn; 
     if (tb.IsSystemObject == false) { 
     StringCollection sc = default(StringCollection); 
     sc = scrp.Script(smoObjects); 
     string st = null; 
     foreach (st in sc) { 
      Console.WriteLine(st); 
     } 
     } 
    } 
} 
+0

注意:這不會創建除表以外的任何內容;我們需要用戶,存儲過程,視圖,用戶定義類型等。 – 2010-05-13 20:28:48

0

其他的答案很好地工作,如果你想有一個徹底的副本,但這裏是另一種方法,你可以通過很感興趣。如果您使用LINQ to SQL,則可以創建DBML文件,然後在數據上下文中使用CreateDatabase()方法。它不會複製整個模式(省略一些約束,UDF,Procs等),但在您可能希望在表上操作並可能劃分數據庫測試的場景中非常有用。

這裏有幾個步驟:

  1. 創建Windows窗體應用程序

  2. 創建DBML文件(LINQ to SQL類)被稱爲富

  3. 將表/對象你」重新感興趣的設計表面

  4. 關閉/保存

  5. 在您的應用程序中的某些地方,您可以編寫如下代碼:

    FooDataContext fooData = new FooDataContext(@「connection string to new database」);

    fooData.CreateDatabase();

Here是上述方法的文檔。

0

可以通過編程的方式進行操作。這些是步驟:

  1. 測試您的「source_test」數據庫是否存在,如果有,請刪除它。
  2. 連接到您的源數據庫,
  3. 創建源數據庫
  4. 的備份還原源數據庫「source_test」數據庫,而重命名實際的數據庫文件
  5. 執行SQL Server實用存儲過程,exec sp_msforeachtable 'truncate table ?'

這會創建一個名爲「source_test」的「源」數據庫的示意圖相同的數據庫。保留所有觸發器,約束,存儲過程,SQL Server帳戶以及不是數據表內容或序列號的其他數據位。所有序列號在其表格被截斷時將被重置爲默認值。

我們使用這5個步驟克隆我們自己的SQL Server數據庫以進行測試和其他用途。這適用於SQL Server 2000轉發。

要備份的數據庫,你的形式執行SQL語句:

"Backup database " + kstrDbName + " to disk = '" + strFullyPathedBackupFile + "' With Init"; 

「以init」是告訴SQL Server覆蓋如果存在指定的文件的密鑰選項。通過查找「備份數據庫」的SQL Server文檔可以找到更多信息。

在SQL Server 2005及更新的版本上,可以使用SMO來恢復數據庫,並指定數據庫的新名稱以及重命名數據庫文件(mdf和日誌文件)。有關如何執行此操作的示例代碼可以在恢復功能的Microsoft SQL Server SMO文檔中找到。

在SQL Server 2000上,沒有SMO支持,因此必須通過執行的SQL語句手動完成。這需要類似形式的語句:

string strSQL = "Restore database " + strDatabaseName + "from disk = '" + strSourcePathFile + "' with replace, " + 
      " Move '" + strDatabaseName + "_Data' to '" + strDestinationPathFile + ".MDF', " + 
      " Move '" + strDatabaseName + "_Log' to '" + strDestinationPathFile + ".LOG' " 

然後使用ALTER語句來重命名實際的MDF文件和日誌文件以匹配新的名稱。是的,這意味着在SQL Server 2000上,您不能擁有源數據庫和目標數據庫。抱歉。在還原的同時可以重新命名MDF和LOG文件,但如果是這樣的話,我的團隊無法使其工作。我們已經開始使用新的SQL Server數據庫,但我認爲我會爲了完整解決這個問題而使用舊代碼。

ALTER語句是形式:

string AlterDbSQL = " Alter database " + strDatabaseName + " MODIFY FILE(NAME = " + Path.GetFileNameWithoutExtension(strDestinationPathFile) + "_DATA, NEWNAME = " + strDatabaseName + "_Data) " + 
         " Alter database " + strDatabaseName + " MODIFY FILE(NAME = " + Path.GetFileNameWithoutExtension(strDestinationPathFile) + "_LOG, NEWNAME = " + strDatabaseName + "_LOG) " 

一些注意事項:如果你有興趣的是創建一個測試數據庫,那麼你不需要執行步驟2(連接源)和第3步(創建備份)每次。只需通過創建備份,恢復它,然後截斷表,爲您想要測試的當前數據庫創建一個「模板」備份。把那個數據庫放回去。現在,您已備份數據庫的數據內容清除版本。這將是一個較小的備份,因此複製速度更快,恢復速度更快。您只需添加測試數據並準備好進行測試。

相關問題