在 SQL Server 企业管理器中更改其中一列并保存,它将创建一个具有新定义的表,并将所有数据复制到该新表中,然后在完成后删除旧表。
但是,如果您的表很大(比如说大约 100GB),则执行此操作可能需要很长时间。更糟糕的是,如果您没有足够的磁盘空间,它不会提前注意到,并且会花费很长时间尝试复制表,耗尽空间,然后决定中止该过程。
我们有其他方法将数据复制成更小的块,但这些方法需要更多的人工干预,因此,只要有足够的磁盘空间,通常只需让企业管理器来解决这个问题就更容易了。
那么对于像这样的长时间运行的“设计表”保存,一旦启动,有没有办法取消?还是只能等它失败?
答案1
表更改本质上是原子性的。无法取消某些操作。这不是企业管理器的错。例如:
CREATE INDEX IX_Authors_Gender ON Authors
( Gender )
将会花费很长时间;没有办法取消这样的操作。
但是,如果你真的想要中止操作,因为您知道它将花费太长时间,或者无论如何它都会失败 - 您可以通过以下方式强制 SQL Server 尽早放弃该作业:
- 终止与 SQL Server 的连接。SQL Server 将回滚正在进行的任何事务
- 停止/终止 SQL Server。当服务器重新启动时,所有正在进行的事务都将回滚
答案2
使用企业管理器 IDE 修改表时生成的 SQL 很少是最佳的 - 它会定期生成一个巨大的临时表,删除并创建一些简单操作(如增加字段长度)的命令。尽可能避免使用 IDE 并编写自己的脚本。并且在考虑运行更改脚本之前,请务必预览它。
您描述的场景中生成的 SQL 将创建一个具有新结构的临时表,使用一些适用的转换代码将数据复制到其中,删除原始表,然后重命名新表。在此过程中,它还将删除任何依赖项(如索引和外键)并针对新表重新创建它们。它在事务中完成所有这些操作,因此如果中断,则不会提交更改。
因此,您可以打开企业管理器的第二个实例,在其中打开进程信息并识别执行更改的连接,然后终止它。几秒钟后,提交更改的另一个实例将因错误而停止,原始表将保持不变。不过,我真的不会养成这种习惯。