【问题标题】:How to do a transactional SMO transfer of a database?如何进行数据库的事务性 SMO 传输?
【发布时间】:2015-10-08 12:12:06
【问题描述】:

我正在使用 SMO 的 Transfer 类将生产数据库复制到测试环境。在生产数据库变得更大并且更频繁地更改之前,这一直非常有效。现在,复制操作通常无法设置约束(我假设就是这样):

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint <...>

这很奇怪,因为我假设复制操作的检索端是在事务范围内的,而 SQL Azure 的默认事务级别是读取提交快照。快照应该不会显示任何违反约束的情况。

我已经尝试将转移的连接放在另一个事务中,但这没有效果。

有人知道吗?

【问题讨论】:

    标签: sql-server azure-sql-database smo


    【解决方案1】:

    我假设本地副本是指您机器上的数据库副本?在这一点上,我们不建议在该场景中使用 SMO。如果源和目标都是 SQL DB,则正确的方法是使用 CREATE DATABASE ... AS COPY OF(您已经这样做了)。如果源或目标是内部部署的,则推荐的方法是使用 Microsoft.SqlServer.Dac 命名空间中的类,如 here 所述。

    一般而言,对于 SMO,启用部分 SMO 集仅用于提供 Management Studio 对 SQL 数据库的访问权限。这些对象提供有限的功能,并不打算在应用程序中使用。关于此的文章已存档,我们正在跟进重新发布。

    【讨论】:

    • 但是,DACFx 似乎非常慢 - 使用 300MB 的相应 .BAK 文件还原示例数据库需要惊人的 40 分钟,而在 SQL SERVER 上还原需要 10 秒。 SMO 也比恢复慢,但没那么慢。我想知道我是否做错了什么。我不敢相信它对任何具有这种性能的人都有用。
    【解决方案2】:

    这两种环境都在 Azure 中吗?如果是这样并且如果您想复制整个数据库,您可能需要考虑使用数据库复制操作(CREATE DATABASE ... AS COPY OF)。它的一个好处是保证副本在事务上是一致的。请参阅here 了解更多信息。

    【讨论】:

    • 我已经在这种情况下使用了“AS COPY OF”,但有时我还想制作 Azure 数据库的本地副本 - 为此,我一直使用 SMO,直到它不再有用为止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-17
    • 2010-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多