web-dev-qa-db-ja.com

AlwaysOnデータベースがプライマリの場合にのみT-SQLを実行する

システムに関する小さな背景。これは、1つのプライマリと1つのセカンダリを持つSQL Server 2012 AlwaysOn可用性グループです。

この記事( SSIS with AlwaysOn )を実行して、SSISをAlwaysOnで動作させました。サーバーの現在の役割を記録するテーブルと、最近フェイルオーバーされたかどうかをチェックする2分ごとに実行されるジョブがあります。私が実行している問題は、セカンダリがSSISDBの読み取り専用接続しか受け入れず、それが原因でスクリプトが実行されないことです。

スクリプトは次のとおりです。

USE master;

DECLARE @last_role TINYINT;
SET @last_role = (
   SELECT TOP 1 [replica_role]
   FROM [dbo].[replica_role]
);

DECLARE @current_role TINYINT;
SET @current_role = (
   SELECT ROLE 
   FROM sys.dm_hadr_availability_replica_states 
   WHERE is_local = 1
);

IF (@last_role = 2 AND @current_role = 1)
BEGIN
    USE SSISDB;
    OPEN MASTER KEY DECRYPTION BY PASSWORD = 'x'
    ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY
END

USE master;
UPDATE dbo.[replica_role] SET [replica_role] = @current_role;

IFステートメントがfalseと評価され、USE SSISDBが実行されないため、エラーが発生している理由について混乱しています。ステートメントを文字列に変換してexecを使用することもできますが、できればできません。スクリプトを実行すると、次のエラーが発生します。

The target database ('SSISDB') is in an availability group and is currently accessible
for connections when the application intent is set to read only. For more information
about application intent, see SQL Server Books Online.
5
Datsun80

セカンダリレプリカのクライアント接続ロール は、データベースを常に使用できるか、読み取り専用接続でのみ使用できるか、またはまったく使用できないかを決定します。データベースを読み取り専用接続に設定する場合、接続文字列には、そのBooks Onlineページで定義されているパラメーターApplicationIntent = ReadOnlyを含める必要があります。

ApplicationIntent = ReadOnlyを指定せずにそのデータベースに接続しようとすると、クエリが失敗します。

4
Brent Ozar