0

私は少し難問を抱えていることに気づきました。ここにいる誰かが助けてくれることを願っています。

古いプロジェクトを継承し、MigratorDotNet を使用してデータベースを展開しています。プロジェクトの展開 (現在は展開システムとして Octopus を使用しています) をテストしているときに、ブローカーが有効になっていないというエラーが発生し始め、アプリケーションが失敗しました。データベースでブローカーを有効にするために移行を作成しましたが、そのために作成した移行は、「複数ステートメントのトランザクション内で ALTER DATABASE ステートメントは許可されていません」というエラーを返します。

移行は次のとおりです。

 [CLSCompliant(false)]
[Migration(201608121015)]
public class EnableSqlServiceBroker : Migration
{
    public override void Down()
    {
        var assemblyRoot = System.Reflection.Assembly.GetExecutingAssembly().Location;
        var webConfigFileLocation = Path.Combine(assemblyRoot.Substring(0, assemblyRoot.IndexOf("\\bin")), "Web.config");
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = webConfigFileLocation }, ConfigurationUserLevel.None);
        var appSettings = (configuration.GetSection("appSettings") as AppSettingsSection);

        var databaseName = appSettings.Settings[Constants.DatabaseName].Value;
        var stringBuilder = new StringBuilder()
            // Declare the BrokerEnabled variable and set it
            .AppendLine("DECLARE @BrokerEnabled bit")
            .AppendLine("SET @BrokerEnabled = 0")
            .AppendLine(
                string.Format("SELECT @BrokerEnabled =  is_broker_enabled FROM sys.databases WHERE name = '{0}'",
                    databaseName))
            .AppendLine("IF(@BrokerEnabled = 1)")
            .AppendLine("BEGIN")
            // disable the broker
            .AppendLine(string.Format("   ALTER DATABASE [{0}] SET DISABLE_BROKER", databaseName))

            .AppendLine("END");
        Database.ExecuteNonQuery(stringBuilder.ToString());
    }

    public override void Up()
    {
        var assemblyRoot = System.Reflection.Assembly.GetExecutingAssembly().Location;
        var webConfigFileLocation = Path.Combine(assemblyRoot.Substring(0, assemblyRoot.IndexOf("\\bin")), "Web.config");
        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = webConfigFileLocation }, ConfigurationUserLevel.None);
        var appSettings = (configuration.GetSection("appSettings") as AppSettingsSection);

        var databaseName = appSettings.Settings[Constants.DatabaseName].Value;
        var stringBuilder = new StringBuilder()
            // Declare the BrokerEnabled variable and set it
            .AppendLine("DECLARE @BrokerEnabled bit")
            .AppendLine("SET @BrokerEnabled = 0")
            .AppendLine(string.Format("SELECT @BrokerEnabled =  is_broker_enabled FROM sys.databases WHERE name = '{0}'", databaseName))
            .AppendLine("IF(@BrokerEnabled = 0)")
            .AppendLine("BEGIN")
            // enable the broker
            .AppendLine(string.Format("     ALTER DATABASE [{0}] SET ENABLE_BROKER", databaseName))

            .AppendLine("END");
        Database.ExecuteNonQuery(stringBuilder.ToString());
    }
}

データベースを変更せずにブローカーを有効にすることはできませんが、明らかに許可されていないため、データベースを変更することはできません。誰もこの問題を回避する方法を知っていますか? それとも修正?前もって感謝します。

4

1 に答える 1

0

データベースを変更する前に、すでに実行中のトランザクションをコミットする必要があります。

于 2016-08-12T16:39:39.877 に答える