2つのデータベースを複数のインスタンスに対してスタンバイ/読み取り専用モードでトランザクションログ配布を設定しています。
トランザクションログを個別のインスタンス(各インスタンスの各DBの1つのコピー)にバックアップおよび復元した後、次の場合、データベースの1つに問題はありません。
ALTER DATABASE [dbname] SET SINGLE USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [dbname] SET MULTI_USER;
もう1つはエラーをスローします。
Failed to update database "other_dbname" because the database is read-only.
両者の違いはわかりません。プロパティを確認しましたが、オプションはすべて同じです。オプションタブから、エラーをスローするデータベースの互換性レベルをSQL Server 2012に設定し、ALTERを許可するデータベースの値をSQL Server 2014に設定しましたが、両方を2014に変更しても問題は解決しませんでした。
問題が何であるか、または何を調べれば正しい方向に向かうかについて、私は完全に困惑しています。
edit:上記のコマンドは、リンクされたサーバーで実行されます。ユーザーは同じで、権限も同じです。SSMSとジョブのどちらで実行しても、最初のデータベースでコマンドを実行でき、2番目のデータベースでは常に失敗します。
マイクロソフトは、SQL Server 2012および2014に関連する2015年の問題を開示しました。
Microsoft SQL Server 2012またはSQL Server 2014データベースを読み取り専用モードに設定するとします。その後、シングルユーザーモードに設定しようとすると、次のエラーメッセージが表示されることがあります。
「メッセージ3906、レベル16、状態1、行51データベースが読み取り専用であるため、データベース「SDP」の更新に失敗しました。
メッセージ5069、レベル16、状態1、行51のALTER DATABASEステートメントが失敗しました。
すべての問題と修正について FIX:データベースが読み取り専用の場合、SQL Server 2012または2014データベースをシングルユーザーモードに設定することはできません で読むことができます。
セキュリティ更新プログラム(2017年8月から)が適用されたSQL Server 2014 SP1を実行しているようです。参照されている問題はそのバージョンのSQL Serverに影響を及ぼし、修正は2014 SP1 CU 2にあると思います
私はSQL Server 2017を実行しています。そのバージョンでは、データベースをシングルユーザー、次に読み取り専用(ケース1)、読み取り専用にしてシングルユーザー(ケース2)に正常に配置できました。
/**CASE-1**/
--Setting single user then read-only
ALTER DATABASE [foo] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [foo] SET READ_ONLY;
--Setting single user then read-only
ALTER DATABASE [foo] SET READ_WRITE;
ALTER DATABASE [foo] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
/**CASE-2**/
--Setting single user then read-only
ALTER DATABASE [foo] SET READ_ONLY;
ALTER DATABASE [foo] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
--Setting single user then read-only
ALTER DATABASE [foo] SET MULTI_USER WITH ROLLBACK IMMEDIATE;
ALTER DATABASE [foo] SET READ_WRITE;
SQL Server 2014のドキュメントを確認しましたが、この機能は2017年と同じように機能しているようです(少なくとも、記載されている違いはありません)。したがって、読み取り専用データベースをシングルユーザーモードにすることはできないという以前の主張を取り戻します。
STANDBY/read_onlyを使用すると、データベースをトランザクションログリストア間の読み取り専用アクセス用に起動できます。また、ウォームスタンバイサーバーの状況、またはログリストア間でデータベースを検査するのに役立つ特別な復旧状況で使用できます。スタンバイデータベースにはAlter
コマンドを適用できません。データベースで実行しているコマンドの目的を考えてください。
ALTER DATABASE [dbname] SET SINGLE USER WITH ROLLBACK IMMEDIATE;
このコマンドは、多数のセッションが接続されており、データベースレベルで操作を適用し、データベースをシングルユーザー(現在のセッション)に入れて、進行中/保留中のすべてのトランザクションをロールバックする必要がある場合に使用します。あなたの場合、データベースはすでにスタンバイケースにあり、コミットされたトランザクションが含まれ、コミットされていないトランザクションがTUFファイルに追加されます。