使用数据备份SQL Server架构

时间:2015-12-04 18:02:46

标签: c# sql-server-2014

我的任务是使用名为 dbobackup 的新架构在我们的“默认架构”数据库 dbo 中创建数据备份到同一个数据库。

老实说,我不明白这对数据库来说意味着什么。显然,这就像在现有数据库中进行数据库备份一样。我想这样做有一些优势。

无论如何,我似乎无法在网上找到允许我这样做的任何地方。

我在这里发现了一些关于在没有数据的情况下复制架构的帖子,但我也需要数据。

Backup SQL Schema Only?

如何查看架构是否存在,如果存在则删除它,然后创建一个接受当前数据库中数据的架构?

创建新模式后,我可以使用这样的简单命令将数据转储到那里吗?

SELECT * INTO [dbobackup].Table1 FROM [dbo].Table1;

但这条线只备份了一张桌子。如果我需要为这个特定客户执行245个表格,我需要一个脚本。

我们也有几个客户,他们的数据库结构不同。

我可以沿着这些方向做点什么吗?

我正在考虑创建一个小型控制台程序来遍历表格。

我如何修改下面的代码来做我想做的事?

public static void Backup(string sqlConnection)
{
    using (var conn = new SqlConnection(sqlConnection))
    {
        conn.Open();
        var tables = new List<String>();
        var sqlSelectTables = "SELECT TableName FROM [dbo];";
        using (var cmd = new SqlCommand(sqlSelectTables, conn))
        {
            using (var r = cmd.ExecuteReader())
            {
                while (r.Read())
                {
                    var item = String.Format("{0}", r["TableName"]).Trim();
                    tables.Add(item);
                }
            }
        }
        var fmtSelectInto = "SELECT * INTO [dbobackup].{0} FROM [dbo].{0}; ";
        using (var cmd = new SqlCommand(null, conn))
        {
            foreach (var item in tables)
            {
                cmd.CommandText = String.Format(fmtSelectInto, item);
                cmd.ExecuteNonQuery();
            }
        }
    }
}

2 个答案:

答案 0 :(得分:1)

SQL Server已内置此功能。如果打开SQL Server Management Studio并右键单击要备份的数据库,然后选择所有任务然后备份,您将获得将数据库备份到现有数据库的选项数据库中。

这是重要的部分以及您应该使用内置功能的原因:您必须以正确的顺序将数据从一个数据库复制到另一个数据库 ,否则您将获得外键到处都是错误。如果你有很多关系很多的数据表,那么你自己就很难确定。您可以编写代码来生成所有依赖项的完整图形,然后确定复制表数据的顺序(这实际上是SQL Server已经执行的操作)。

此外,还有第三方程序可用于执行此类备份(请参阅:Google)。

答案 1 :(得分:0)

这是一种我正在开始的“正在进行中”的方法看起来很有希望:

public static void CopyTable(
  string databaseName,   // i.e. Northwind
  string tableName,      // i.e. Employees
  string schema1,        // i.e. dbo
  string schema2,        // i.e. dboarchive
  SqlConnection sqlConn)
{
    var conn = new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConn);
    var server = new Microsoft.SqlServer.Management.Smo.Server(conn);
    var db = new Microsoft.SqlServer.Management.Smo.Database(server, databaseName);
    db.Tables.Refresh();
    for (var itemId = 0; itemId < db.Tables.Count; itemId++)
    {
        var table = db.Tables.ItemById(itemId);
        if (table.Name == tableName)
        {
            table.Schema = String.Format("{0}", DatabaseSchema.dboarchive);
            table.Create();
        }
    }
}

我目前遇到的唯一问题是我的 db 变量总是返回 Tables.Count == 0

如果我有机会解决这个问题,我会更新。

目前,我被告知要删除这段代码并检查我的代码。