【问题标题】:Move all database tables under another database with new Schema?使用新架构将所有数据库表移动到另一个数据库下?
【发布时间】:2013-10-02 22:31:27
【问题描述】:

所以我的任务是研究我以前从未做过的事情。

在 VS2010 中使用 C# 构建的 3 个应用程序模块正在使用 1 个数据库 (Database1),其中包含 dbo.Samples 等表,这些表都具有架构“dbo.Table ”。出于某些未知原因,已要求将 Database1 下的所有这些表移到 Database2 中,该数据库具有更多模式,例如 padmin.PSTIF、petro.Facilities、webdc.AppTransactions 等。

在这 3 个模块中,所有的连接字符串都是通过 app.config 文件配置的,所有用于显示的数据事务/选择都是通过使用连接字符串的硬编码 SQL 语句完成的。

我担心的是,如果我将 dbo.Samples 从 Database1 移到 Database2 中,并将架构更改为诸如 moss.Samples 之类的东西,那么这些硬-编码语句也需要更新吗?目前我可以编写类似“SELECT * FROM Samples”的代码。我是否必须更改此语句,因为它将使用新架构,即使我将连接字符串更新为 Database2?

编辑:

我在 DB2 的测试环境版本中添加了一些 DB1 的虚拟副本表,并在应用程序中进行了实验。将连接字符串更改为现在指向 DB2 后,我发现我必须遍历每个硬编码 SQL 语句并更改表的每次使用以包含新模式(将 FROM Sample 更改为 FROM moss.Sample)。

有谁知道是否可以在连接字符串本身中指定我希望使用的架构?如果可能的话,这将使我免于在 3 个应用程序中更改大约 200 条单独的语句。

我的示例连接字符串如下:

<connectionStrings>
    <add name="conString" connectionString="Data Source=SERVER.domain.state.acroynym.us;Initial Catalog=DatabaseName;Integrated Security=true;"
        providerName="System.Data.SqlClient" />
</connectionStrings>

我尝试将Initial Catalog=DatabaseName 更改为Initial Catalog=DatabaseName.moss,但应用程序返回找不到数据库DatabaseName.moss,这是有道理的,只是觉得值得一试。

【问题讨论】:

  • 相关 - 请阅读两者以了解为什么你不应该使用 SELECT * FROM Samples : sqlblog.com/blogs/aaron_bertrand/archive/2009/10/10/… sqlblog.com/blogs/aaron_bertrand/archive/2009/10/11/…
  • 感谢 Aaron 的文章,但为了澄清我以SELECT * FROM Samples 为例。我的真实陈述只返回必要的列。
  • 架构前缀文章仍然适用:不要试图找到一些技巧,这样您就可以懒惰地不指定架构。这比一次性迁移的便利性更重要。
  • 阅读文章后,我明白了它的重要性。我仍然很好奇,是否可以修改连接字符串以某种方式指向我想要的架构,从而使我无需更改 3 个应用程序中的 200 条硬编码 SQL 语句来获得带有表名的新架构。
  • @AnalyticLunatic 不,连接字符串无法告诉您的应用程序使用moss 而不是dbo。虽然您可以更改应用程序用户(假设是 SQL 身份验证)或所有 Windows 用户的默认架构,但 这不是一件好事。

标签: c# .net sql sql-server visual-studio-2010


【解决方案1】:

嗨,分析疯子,

您可能还需要在数据库方面采取一些额外的步骤。仅仅复制一个数据库并不会复制它的所有附加信息。触发器、约束、索引和权限不会自动复制到新数据库中。使用复制向导可能会更好。

【讨论】:

  • 哦,我确定有!我自己从来没有做过数据库迁移。我只是被要求调查这个问题,因为我是我们小组中唯一剩下的使用 DB1 的应用程序的原始开发人员。
【解决方案2】:

你的问题有很多隐含的问题、潜在的问题和未知数......只是几点:

1) 是的,您可以通过多种不同的方式轻松地将数据从一个表移动到另一个表,或者两个完全不同的数据库。包括SSIS"select into"

2) 不,您很少想在生产代码中执行“选择 *”。

3) 是的,访问一个表中的一列的任何硬编码语句都可能必须修改以访问不同表中的不同列:)

【讨论】:

  • 为了澄清,我以SELECT * FROM Samples 为例。我的真实陈述只返回必要的列。所以在第 3 点,如果我将所有内容都移到 DB2 中,而不是说 FROM Samples 并且应用程序隐含地知道我的意思是来自 DB1 的 dbo.Samples 在连接字符串中,我将不得不做 FROM moss.Samples 即使连接字符串新指向到 DB2?在 DB1 中,所有模式都是 dbo,而在新的 DB2 中,已经列出了几个不同的模式。
  • 啊,所以您的问题实际上是关于“完全限定名称”的。建议:1)不要太挂在“连接字符串”上:还有很多其他问题/替代方案需要考虑,2)查看其中一些链接:Fully Qualified Table Names & SynonymsSQL Server Set Default Schemastackoverflow.com/questions/4273242/…。 '希望对您有所帮助...
  • 感谢您的文章。我已经根据我现在在这个问题上的立场编辑了我的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
相关资源
最近更新 更多