1

我目前正在评估 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。我不会在我的任何脚本中删除列或表。有谁知道为什么会发生这种情况?

4

1 回答 1

4

我通读了 RedGate 提供的有关 V2 迁移如何工作的文档(在此处找到),但它并没有我希望的那么大。我还发现了一个人遇到了类似问题的 Google Group论坛帖子。RedGate 在那篇文章中说,当使用 LocalDB 作为临时服务器时,数据库是在实例 (LocalDB)\RedGateTemp 中创建的。重要的是要注意 Migrations V2 仍处于测试阶段,因此这可能会改变。

我知道 localDB 已安装,因为我sqlLocalDb从命令提示符运行了这个命令并且没有引发错误。我还能够通过 Sql Server Management Studio 连接到 (localDb)\RedGateTemp,因此运行良好。经过一些试验和错误后,我能够弄清楚 V2 迁移发生了什么。

  1. SQLCompare 看到您正在将脚本文件夹与数据库进行比较(在本例中为测试),并且有一个新的迁移脚本
  2. SQLCompare 从部署数据库中提取架构信息并在 (LocalDB)\RedGateTemp 上创建该数据库的副本
  3. SQLCompare 然后在临时数据库 (LocalDB)\RedGateTemp 上运行新的迁移脚本
  4. SQLCompare 找出更改并生成迁移脚本,或者如果您使用 /sync 开关,则部署更改
  5. 如果在 (LocalDB)\RedGateTemp 上创建临时数据库期间发生异常,则删除整个临时数据库,但仍会运行迁移脚本。

我发现我的错误是在 (LocalDB)\RedGateTemp 上运行 SQL Profiler,它监控来自错误和警告部分的事件 ErrorLog 和 EventLog 以及来自 TSQL 部分的 SQL:BatchStarting。通过这样做,我看到 LocalDB 在从测试数据库创建带有全文字段上包含命令的表值函数时抛出错误。LocalDB 不支持该功能。对我来说幸运的是,不需要该功能,因此我将其删除。在那之后,一切又开始工作了。

我想分享我是如何解决这个问题的,以帮助人们找到正确的方向。

于 2014-05-22T17:17:09.260 回答