有了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