我目前正在评估 RedGate SQL Source Control 和 SQLCompare 在我们的持续集成计划中的使用。开始一切都很顺利,很容易添加/删除表,添加可空列,删除列等等,没有任何问题。直到我开始研究迁移脚本。我尝试的简单示例是使可空列不可为空。
我们的流程:在共享开发 SQL Server 中进行更改 -> 将更改签入源代码管理 -> 通过将源代码管理与测试数据库进行比较,部署到测试环境。
设置:
- 源代码控制:GIT
- 模型:共享 - 所有开发人员都在同一个数据库上工作
- 临时数据库:LocalDB - 开发人员无法在服务器上创建数据库
- 使用源代码控制作为“真相中心”,因为有人可能正在开发服务器上进行更改。可能会推高意外/未完成的更改。
示例迁移脚本:
DECLARE @ShouldRunMigrationScript BIT
SET @ShouldRunMigrationScript = 1
IF EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.Columns WHERE TABLE_SCHEMA = 'dbo' AND table_name='Test' AND COLUMN_NAME = 'testColumn' AND IS_NULLABLE = 'No')
BEGIN
SET @ShouldRunMigrationScript = 0;
PRINT 'Column [testColumn] in [dbo].[Test] is already not nullable - skipping migration';
END
IF @ShouldRunMigrationScript = 1
BEGIN
UPDATE [dbo].[Test] SET testColumn = anotherTestColumn WHERE TestColumn IS NULL;
ALTER TABLE [dbo].[Test] ALTER COLUMN [testColumn] VARCHAR(500) NOT NULL;
END
我从命令提示符运行 SQL 比较:
"C:\Program Files (x86)\Red Gate\SQL Compare 10\sqlcompare" /scripts1:"[Folder where SQL Source Control Saves]" /Server2:[Test SQL Server] /Database2:[Test Database] /scriptfile:"c:\Migrations.txt" /f /Options:Defaults,UseMigrationsV2
它给了我这个错误“运行迁移脚本时出错:无效的对象名称'dbo.Test。'
开发和测试 SQL 服务器都有 dbo.Test。我不会在我的任何脚本中删除列或表。有谁知道为什么会发生这种情况?