RedGate Migrations V2 Beta不断获取无效对象名称[TableName]

时间:2014-05-22 17:17:09

标签: data-migration redgate sqlcompare

我目前正在评估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 Compare:

"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。我没有删除任何脚本中的列或表。有没有人知道为什么会这样?

1 个答案:

答案 0 :(得分:4)

我阅读了有关RedGate提供的V2迁移工作的文档(找到here),但它没有像我希望的那样有用。我还发现了谷歌集团forum post,其中一个人遇到了类似的问题。在该帖子中,RedGate说当使用LocalDB作为临时服务器时,数据库是在实例(LocalDB)\ RedGateTemp中创建的。值得注意的是,迁移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上创建临时数据库期间发生异常,则会删除整个临时数据库,但仍会运行迁移脚本。
  6. 我做了什么来查找我的错误是在(LocalDB)\ RedGateTemp上运行SQL事件探查器,它监视来自错误和警告部分的事件ErrorLog和EventLog以及来自TSQL部分的SQL:BatchStarting。通过这样做,我看到当从测试数据库创建一个在全文字段上包含Contains命令的表值函数时,LocalDB会抛出错误。 LocalDB不支持该功能。幸运的是,我不需要这个功能所以我删除了它。之后,一切都开始了。

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