如何以编程方式克隆SQL Server中的数据库架构?

时间:2009-02-11 22:11:03

标签: sql-server

我想在我的项目上设置一些可靠的测试,我想要的方式是有一个我可以运行的命令行程序,它只复制数据库的结构,而不是实际的数据。然后我可以在新数据库上运行我的测试。

想法?

更新:有人说我应该指定一种语言。我正在考虑TSQL,如果Sql Server运行,脚本应该运行。此外,它是SQL Server 2005。

5 个答案:

答案 0 :(得分:3)

您没有说明您正在使用哪个版本的SQL Server,如果它的2005年是DMO - 数据库管理对象,这是一组COM库,可让您访问企业管理器/ Management Studio中的功能。< / p>

对于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); 
         } 
      } 
   } 
} 

答案 1 :(得分:0)

答案 2 :(得分:0)

如果您想要一份完整的副本,其他答案也可以正常运行,但这是另一种您可能会对此感兴趣的方法。如果您使用的是LINQ to SQL,则可以创建DBML文件,然后在数据上下文中使用CreateDatabase()方法。它不会复制整个模式(省略一些约束,UDF,Proc等等),但在您可能希望对表进行操作并可能对数据库测试进行分区的情况下非常有用。

以下是几个步骤:

  1. 创建Windows窗体应用程序

  2. 创建名为Foo

  3. 的DBML文件(LINQ to SQL类)
  4. 将您感兴趣的表格/对象拖到设计图面

  5. 关闭/保存

  6. 您的应用程序中的某些位置可以编写如下代码:

    FooDataContext fooData = new FooDataContext(@“连接新数据库的字符串”);

    fooData.CreateDatabase();

  7. Here是我上述方法的文档。

答案 3 :(得分:0)

遗憾的是,我们发现的最自动的过程实际上是使用其中一种鼠标控制工具来实际使用SSMS来复制数据库。我很乐意做别的事,但没有一个答案符合我们的要求。

答案 4 :(得分:0)

可以按程序执行所要求的操作。这些是步骤:

  1. 测试您的“source_test”数据库是否存在,如果存在,请将其删除。
  2. 连接到您的源数据库,
  3. 创建源数据库的备份
  4. 在重命名实际数据库文件时将源数据库还原到“source_test”数据库
  5. 执行SQL Server实用程序存储过程exec sp_msforeachtable 'truncate table ?'
  6. 这将创建一个名为“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和LOG文件以匹配新名称。是的,这意味着在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(创建备份)。只需通过创建备份,还原它,然后截断表来创建要测试的当前数据库的“模板”备份。回到那个数据库。现在,您可以备份数据库清除的数据库版本。它将是一个较小的备份,因此复制速度更快,恢复速度更快。您只需添加测试数据即可进行测试。