2009-12-31 51 views
1

我正在嘗試設置一個測試數據庫,以針對自動化測試運行。我理解我們應該使用模擬對象,但這是一箇舊的應用程序,這樣做並不像應該那樣容易。數據庫中有太多的邏輯。不管怎樣,足夠的背景故事。我得到一個乾淨的數據庫設置,測試可以加載已知數據,因此結果也是已知的。保持數據庫結構和特效同步

在測試開始時,將運行一個.sql腳本來清​​空表格,然後用測試數據填充它們。我看到的問題並不是讓數據庫結構保持同步,因爲它們變化不大(雖然這也會很好),但是要將所有的特效/函數等從開發中移到開始時的測試中測試。

是否有SQL命令可以執行此操作?從開發數據庫讀取一個proc,並將其複製到測試數據庫?

編輯:我實際上發現使用SQL管理對象工作得很好。

唯一的問題是,如果有人重命名了一個項目,內部引用不會被sql server更新,並且它是在舊名稱下創建的。有沒有辦法來解決這個問題?

+0

兩臺服務器是否連接?或者兩個數據庫都在同一臺服務器上?換句話說,我們可以假設一個SQL腳本可以訪問這兩個數據庫嗎? – Aaronaught 2009-12-31 20:06:25

+0

同一臺服務器,不同的數據庫。 – CaffGeek 2009-12-31 20:10:22

+0

重命名操作使用sp_rename,它不會觸發任何DDL觸發器,因此沒有簡單的方法來記錄這些。但是根據你想要完成的工作,爲什麼不從開發數據庫拷貝數據庫之前,在測試數據庫中刪除全部**函數/過程呢? – Aaronaught 2010-01-01 19:19:42

回答

0

有了SMO,下面的作品很棒!並在〜40秒內複製。

private static void CopyDBSchema(string sourceDBServer, string sourceDBName, string targetDBServer, string targetDBName) 
    { 
     Server server = new Server(sourceDBServer); 
     server.SetDefaultInitFields(true); 

     Database db = server.Databases[sourceDBName]; 
     Transfer t = new Transfer() 
     { 
      Database = db, 

      CopyData = false, 
      CopyAllObjects = false, 
      CopyAllUsers = false, 
      CopyAllLogins = false, 

      CopySchema = true, 
      CopyAllTables = true, 
      CopyAllViews = true, 
      CopyAllStoredProcedures = true, 
      CopyAllDatabaseTriggers = true, 
      CopyAllUserDefinedAggregates = true, 
      CopyAllUserDefinedDataTypes = true, 
      CopyAllUserDefinedFunctions = true, 
      CopyAllUserDefinedTypes = true, 

      DropDestinationObjectsFirst = true, 
      UseDestinationTransaction = true, 
      DestinationServer = targetDBServer, 
      DestinationDatabase = targetDBName 
     }; 

     t.Options.WithDependencies = true; 
     t.Options.IncludeIfNotExists = true; 
     t.Options.DriPrimaryKey = true; 
     t.Options.DriForeignKeys = true; 
     t.Options.DriIndexes = true; 
     t.Options.DriNonClustered = true; 
     t.Options.DriUniqueKeys = true; 
     t.Options.DriAllKeys = true; 
     t.Options.Triggers = true; 

     t.TransferData(); 
     server = null; 
    } 
+0

實際上,它複製了一切,除了因爲某些原因沒有標識設置的鍵。 – CaffGeek 2010-01-05 18:15:24

+0

需要應用Service Pack – CaffGeek 2010-01-05 22:41:06

3

你說保持「數據庫結構」同步並不是一個問題,但是你繼續說你需要從開發移動特殊功能/測試功能。這些是數據庫結構的一部分! IAC,我會建議像Red-Gate的SQL Compare這樣的工具。它將移動dev上存在的任何不存在於測試上的數據庫結構。非常好的工具。我用了很多年。

+0

@Randy,當我說「結構」時,我的意思是「表格結構」。我們有SQL Compare,它的效果很好。但我想自動化這種能力。我不想知道在每次運行測試之前運行該工具以檢查數據庫結構是否相同。我希望通過調用一個將從1分貝複製到另一個分支的過程來理想地在.NET代碼中處理這個檢查。 – CaffGeek 2009-12-31 20:12:23

+0

@Chad - 你是否知道SQL比較可以從命令行運行,因此以自動化的方式運行? – 2009-12-31 20:17:26

+0

@Randy - 它並沒有安裝到任何地方。 – CaffGeek 2009-12-31 20:24:34

3

乍得,我不知道你如何使用這個自動化。如果你想立刻編寫所有的特效,你可以從SQL企業管理器中完成。

在每個測試腳本之前,所有從Dev開發的過程對於CREATE。在TEST中放下你的proc並從dev文件運行腳本。這將確保你的procs同步。

1

這裏有一個快速和骯髒的SQL腳本,您可以使用存儲過程從一個數據庫複製到另一個:

USE DestinationDatabase 

GO 

DECLARE 
    @SchemaName sysname, 
    @ProcName nvarchar(4000), 
    @ProcDefinition nvarchar(max), 
    @DropSql nvarchar(4000) 

SET @SchemaName = 'dbo' 

DECLARE crProcedures CURSOR FAST_FORWARD FOR 
    SELECT r.ROUTINE_NAME, r.ROUTINE_DEFINITION 
    FROM SourceDatabase.INFORMATION_SCHEMA.Routines r 
    WHERE ROUTINE_SCHEMA = @SchemaName 
    AND ROUTINE_NAME IN ('Procedure1', 'Procedure2', 'Procedure3') 
OPEN crProcedures 
FETCH NEXT FROM crProcedures INTO @ProcName, @ProcDefinition 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    SET @DropSql = 'IF EXISTS ' + 
     '(SELECT * FROM sys.objects ' + 
     'WHERE object_id = OBJECT_ID(N''' + @ProcName + ''') ' + 
     'AND type in (N''P'', N''PC'')) ' + 
     'DROP PROCEDURE ' + @ProcName 
    EXEC sp_executesql @DropSql 
    EXEC sp_executesql @ProcDefinition 

    FETCH NEXT FROM crProcedures INTO @ProcName, @ProcDefinition 
END 
CLOSE crProcedures 
DEALLOCATE crProcedures 

只要確保你不要混淆SourceDatabaseDestinationDatabase,否則你會遇到麻煩!

相關問題