私は少し難問を抱えていることに気づきました。ここにいる誰かが助けてくれることを願っています。
古いプロジェクトを継承し、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());
}
}
データベースを変更せずにブローカーを有効にすることはできませんが、明らかに許可されていないため、データベースを変更することはできません。誰もこの問題を回避する方法を知っていますか? それとも修正?前もって感謝します。