【发布时间】:2016-07-02 15:20:09
【问题描述】:
我正在为数据库编写迁移脚本,并希望使其具有幂等性,因此我们可以安全地运行它任意次数,而不必担心它会在第一次尝试后更改数据库(/迁移数据) .
此迁移的一部分涉及从表中删除列,但首先将该数据插入到另一个表中。为此,我有一些类似的东西。
IF EXISTS
(SELECT * FROM sys.columns
WHERE object_id = OBJECT_ID('TableToBeModified')
AND name = 'ColumnToBeDropped')
BEGIN
CREATE TABLE MigrationTable (
Id int,
ColumnToBeDropped varchar
);
INSERT INTO MigrationTable
(Id, ColumnToBeDropped)
SELECT Id, ColumnToBeDropped
FROM TableToBeModified;
END
第一次通过,这工作正常,因为它仍然存在。但是,在随后的尝试中,它失败了,因为该列不再存在。我知道对整个脚本进行了评估,我可以将内部内容放入 EXEC 语句中,但这真的是解决这个问题的最佳解决方案,还是有另一个仍然可能“强制执行有效性”的选项?
【问题讨论】:
-
另一种选择是将 CREATE 和 INSERT 放入 sp。
-
动态 SQL 比抽象成存储过程更简单。
-
@Balde 我同意 Aaron 的观点,尤其是因为这是一个一次性脚本,而且您仍然需要该存储过程的推出脚本,因此不会真正保存任何内容。
-
@srutzky 我同意。只是说“另一种选择”。
-
@Balde SP 也经过验证,对吧?那么这不会有同样的问题吗?
标签: sql-server database-migration