web-dev-qa-db-fra.com

Exécuter T-SQL uniquement si la base de données TOMAINON est primaire

Petit fond sur le système. C'est SQL Server 2012 GROUPE DE DISPONIBILITÉ AUSSI AVEC 1 PRIMAIRE ET 1 SECONDAIRE.

Je suis suivi cet article ( SSIS avec TautMonon ) pour faire fonctionner les SSIS avec toujours. J'ai une table qui enregistre le rôle actuel du serveur et un travail qui fonctionne toutes les deux minutes en vérification si elle a récemment échoué. Le problème que je suis en cours d'exécution est que le secondaire accepte uniquement les connexions réadonnées pour le SSISDB et mon script n'exécutera pas à cause de cela.

Voici le script:

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;

Je suis confus sur la raison pour laquelle l'erreur se passe parce que l'instruction IF _ est évaluée à FALSE, de sorte que l'utilisation SSISDB ne soit pas exécutée. Je pourrais transformer les déclarations en chaînes et utiliser EXEC, mais je préférerais ne pas si possible. Lorsque j'exécute le script, c'est l'erreur que je reçois:

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

Le rôle de connexion client pour les répliques secondaires Détermine si votre base de données est toujours disponible ou uniquement disponible pour lire uniquement les connexions, ou non disponibles du tout. Si vous définissez la base de données sur les connexions en lecture seule, votre chaîne de connexion doit inclure le paramètre ApplicationIntent = Readonly tel que défini dans la page Livres en ligne.

Lorsque vous essayez de vous connecter à cette base de données sans spécifier ApplicationIntent = Readonly, votre requête échouera.

4
Brent Ozar