我有一个特定的数据库脚本,它需要作为最后一个迁移脚本运行,并且每次我在数据库上运行迁移时都需要运行它(即使之前已经运行过)。
我可以使用非常大的迁移ID来确保此迁移最后运行。但是,我不知道该如何强制每次重新运行此迁移:一旦运行,它将被添加到dbo.VersionInfo
表中,而下一次FluentMigrator在该表中看到它时,它将不会运行再次。
[Migration ( 209912312359 )]
public class M209912312359 : Migration
{
public override void Down ()
{
// I want this particular migration to always run
// as the last migration script and to run every time.
}
}
是否有某种迁移属性告诉FluentMigrator每次都运行此脚本,而不管以前的运行情况如何? (
Migration
基类对此没有任何要重写的东西。)我正在使用FluentMigrator 1.4。
编辑:
这是清除数据库中某些数据的数据迁移。在工作中,我们有大量的数据库(相同的架构,不同的数据)。一个特定的表(我们称其为
dbo.A
)必须在所有数据库中具有相同顺序的相同数据。我们使用迁移将数据添加到该表中,但是有时-根据特定数据库中运行的迁移-dbo.A
的实例可能会不同步。迁移的目的是确保
dbo.A
的所有实例都包含相同顺序的相同数据。我们不能删除dbo.A
并只能重新创建它,因为它的ID
列用作外键。如果可能的话,我想拥有一个迁移解决方案,因为作为部署的一部分,迁移是唯一可以保证在我们所有环境中运行的东西,而更改它将非常困难。 (如果FluentMigrator无法做到这一点,我们可能别无选择。)
最佳答案
从上面的评论中得到了这一点,但这可能会对其他人有所帮助
using FluentMigrator;
using System;
namespace Example
{
[Maintenance(MigrationStage.AfterAll)]
public class RefreshAllViews : FluentMigrator.Migration
{
public override void Up()
{
Execute.Sql(@"
DECLARE views_cursor CURSOR FOR
SELECT name FROM sysobjects WHERE type = 'V' AND uid = 1
OPEN views_cursor
DECLARE @view NVARCHAR(500)
FETCH NEXT FROM views_cursor INTO @view
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN TRY
EXEC sp_refreshview @view
END TRY
BEGIN CATCH
PRINT 'VIEW NAME: ' + @view +
', ERROR NUMBER: ' + Cast(ERROR_NUMBER() as VARCHAR) +
', ERROR MESSAGE: ' + ERROR_MESSAGE()
END CATCH
FETCH NEXT FROM views_cursor INTO @view
END
CLOSE views_cursor
DEALLOCATE views_cursor");
}
public override void Down()
{
throw new NotImplementedException();
}
}
}