有了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;
}
兩臺服務器是否連接?或者兩個數據庫都在同一臺服務器上?換句話說,我們可以假設一個SQL腳本可以訪問這兩個數據庫嗎? – Aaronaught 2009-12-31 20:06:25
同一臺服務器,不同的數據庫。 – CaffGeek 2009-12-31 20:10:22
重命名操作使用sp_rename,它不會觸發任何DDL觸發器,因此沒有簡單的方法來記錄這些。但是根據你想要完成的工作,爲什麼不從開發數據庫拷貝數據庫之前,在測試數據庫中刪除全部**函數/過程呢? – Aaronaught 2010-01-01 19:19:42