2009-02-11 102 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步(创建备份)每次。只需通过创建备份,恢复它,然后截断表,为您想要测试的当前数据库创建一个“模板”备份。把那个数据库放回去。现在,您已备份数据库的数据内容清除版本。这将是一个较小的备份,因此复制速度更快,恢复速度更快。您只需添加测试数据并准备好进行测试。

相关问题