首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用数据备份Server架构

用数据备份Server架构
EN

Stack Overflow用户
提问于 2015-12-04 18:02:46
回答 2查看 1.4K关注 0票数 3

我的任务是使用一个名为dbobackup的新模式将“默认模式”数据库dbo中的数据备份到同一个数据库。

老实说,就数据库而言,我不明白这意味着什么。显然,这就像在现有数据库中进行数据库备份一样。我想这样做是有好处的。

无论如何,我似乎在网上找不到任何能让我这么做的地方。

我在这里找到了一些关于在没有数据的情况下复制模式的帖子,但我也需要这些数据。

Backup SQL Schema Only?

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

一旦创建了新模式,可以使用这样的简单命令将数据转储到其中吗?

代码语言:javascript
复制
SELECT * INTO [dbobackup].Table1 FROM [dbo].Table1;

不过,这一行只备份了一张表。如果我需要对这个特定客户的245个表执行此操作,我将需要一个脚本。

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

我能做些类似的事情吗?

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

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

代码语言:javascript
复制
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();
            }
        }
    }
}
EN

回答 2

Stack Overflow用户

发布于 2015-12-04 18:13:40

Server已经内置了此功能。如果打开并右键单击要备份的数据库,然后选择“所有任务”然后选择“备份”,则将获得将数据库备份到现有数据库的选项。

这是重要的部分,也是为什么您应该使用内置功能:您必须以正确的顺序将数据从一个DB复制到另一个DB,否则您会在整个地方得到外键错误。如果您有大量的数据表和许多关系,这将是很难确定您自己。您可以编写代码来生成所有依赖项的完整图表,然后确定复制表数据的顺序(这基本上就是Server已经做的事情)。

此外,还有第三方程序也可以进行这种类型的备份(请参阅: Google)。

票数 1
EN

Stack Overflow用户

发布于 2015-12-10 21:58:52

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

代码语言:javascript
复制
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一起返回。

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

现在,我被告知要删除这段代码并签入我的代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34094608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档