我最近尝试了 2 个数据库的大合并。我们将数据库 2 中的模式重新创建到数据库 1 中,并创建了一个脚本来将数据库 2 中的所有数据传输到数据库 1。该脚本需要大约 35 分钟的时间来运行并处理以下事务:
BEGIN TRANSACTION
...
IF(@@error<>0)
COMMIT TRANSACTION
ELSE
ROLLBACK TRANSACTION
完整的脚本有点敏感,但这里有一些结构相同的 SQL:http: //pastebin.com/GWJ3ZnkF
我们运行了脚本,所有数据都被正确传输。我们测试了使用新组合数据库运行的系统(删除了对旧数据库的访问权限)。
但作为最后一项任务,我们想让旧数据库脱机,以确保没有人使用该数据库。为此,我们使用了:
ALTER DATABASE <dbname> SET OFFLINE WITH ROLLBACK IMMEDIATE
这很糟糕。在这行 SQL 代码之后,我们刚刚复制的组合数据库中的所有数据突然消失了。我首先假设它还没有真正完成,所以“立即回滚”听起来像是对我的事务执行了回滚..
但为什么?事务不是已经提交了吗?
我也尝试再次运行相同的脚本几次,但每次尝试后都没有复制数据,即使它说脚本成功。我不知道为什么......它是否记得我的离线回滚?
我的连接到底发生了什么?