我目前正在评估RedGate SQL Source Control和SQLCompare在我们的持续集成计划中的使用。开始一切都非常顺利,很容易添加/删除表,添加可空列,删除列,等等没有任何问题。直到我开始查看迁移脚本。我尝试的一个简单示例是使可空列无法为空。
我们的流程:在共享开发SQL Server中进行更改 - >将更改检入源代码管理 - >通过将源代码控制与测试数据库进行比较来部署以测试环境。
设定:
示例迁移脚本:
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。我没有删除任何脚本中的列或表。有没有人知道为什么会这样?
答案 0 :(得分:4)
我阅读了有关RedGate提供的V2迁移工作的文档(找到here),但它没有像我希望的那样有用。我还发现了谷歌集团forum post,其中一个人遇到了类似的问题。在该帖子中,RedGate说当使用LocalDB作为临时服务器时,数据库是在实例(LocalDB)\ RedGateTemp中创建的。值得注意的是,迁移V2仍处于测试阶段,因此可能会发生变化。
我知道安装了localDB,因为我从命令提示符运行了sqlLocalDb
命令,并且没有抛出任何错误。我也可以通过Sql Server Management Studio连接到(localDb)\ RedGateTemp,因此运行正常。经过一些试验和错误后,我能够弄清楚V2迁移的情况。
我做了什么来查找我的错误是在(LocalDB)\ RedGateTemp上运行SQL事件探查器,它监视来自错误和警告部分的事件ErrorLog和EventLog以及来自TSQL部分的SQL:BatchStarting。通过这样做,我看到当从测试数据库创建一个在全文字段上包含Contains命令的表值函数时,LocalDB会抛出错误。 LocalDB不支持该功能。幸运的是,我不需要这个功能所以我删除了它。之后,一切都开始了。
我想分享一下我是如何解决这个问题的,以帮助人们指出正确的方向。