Agent SQL et réplicas AlwaysOn (HADR – Availability Groups), ma base est-elle active ?

Lorsque l’on utilise la haute disponibilité via AlwaysOn, il est nécessaire de savoir quelles sont les bases actives dans l’instance afin que certains travaux de maintenance via l’Agent SQL ne prenne en compte que ces bases là. Voici 7 fonctions utilisateurs (UDF – User Defined Function) de métadonnées pour obtenir de telles informations.

Rappelons que, dans la haute disponibilité via la technologie ALwaysOn, il est possible de dupliquer les bases que l’on veut jusque dans 7 instances différentes en sus de la base active. Comme le système permet de basculer de manière automatique en mode synchrone sans aucune perte de données (et qu’il ne prévient pas…) il n’est pas toujours facile de savoir si la ou les bases que l’on voit dans une instance sont actives, c’est à dire opérationnelles ou non (lisible avec l’édition Enterprise). Pour ce faire, j’ai codé 7 fonctions qui permettent de savoir si le groupe de disponibilité est primaire ou non, si une base est primaire ou non, si une base est enrôlée dans un groupe de disponibilité ou non, et enfin si elle est opérationnelle ou non.

Un peu de vocabulaire

Avant de donner le code de ces fonctions il me faut éclaircir certains points. Ce qu’est AlwaysOn, quels en sont ses composants et la terminologie employée.

AlwaysOn est le nom commercial de la technologie de haute disponibilité intégrée à Microsoft SQL Server depuis la version 2012.

AlwaysOn nécessite d’enregistrer les serveurs Windows qui vont assurer la disponibilité des bases SQL Server dans un cluster système (le terme anglais « cluster » voulant simplement dire « emplacement) dit de basculement (failover en anglais). Un tel cluster est appelé WSFC (Windows Server Failover Clustering). C’est lui qui assure la couche de « heartbeat » (battement de cœur – mécanisme qui consiste à échanger de petits paquets réseau entre les serveurs pour vérifier l’état des différents partenaires) et intime le basculement des bases s’il y a lieu. Pour assurer le quorum (vote à majorité absolu afin d’éviter le syndrome du « split-brain« ), différentes méthodes sont disponibles.

Une fois ce cluster systèmes créé (c’est la partie la plus pointue), il faut maintenant définir quels sont les instances SQL (une instance étant une installation de SQL Server sur une machine – SQL Server tolérant jusqu’à 50 instances par machine enrôlées dans ce cluster de basculement) qui vont participer à assurer la haute disponibilité des bases.

Maintenant, tout le reste du travail se fait directement dans SQL Server, à l’aide d’un assistant.

Un groupe de disponibilité (AG ou Availability Group) est un ensemble de bases de données destinées à basculer en même temps. Dans SQL Server il est hélas assez courant qu’une même application exploite différentes bases en effectuant des requêtes croisées entre les bases par le biais de jointures interbases (SQL Server étant optimisé pour cela contrairement à la plupart des autres SGBDR…). Il n’est donc pas rare qu’un groupe de disponibilité contiennent plusieurs bases devant basculer simultanément en cas de défaillance de l’une d’entre elles.

Une base peut donc être enrôlée dans un groupe de disponibilité, ou pas. En particulier, les bases systèmes ne peuvent pas être jointe à un groupe de disponibilité, car elles détiennent des informations spécifique à chaque instance de SQL Server. Une même base ne pouvant être enrôlée que dans un seul groupe de disponibilité.

Dans un tel système une base peut donc être dupliquée jusqu’à 7 fois. Mais, seule, la base source reste pleinement opérationnelle (lectures et écritures), y compris pour des fonctions de bas niveau comme l’ajout d’espaces de stockage… Les autres pouvant uniquement être lues.

Une fois que l’ensemble des bases que l’on souhaite a été enrôlé dans les différents groupes de disponibilité créés, il faut fixer la règles du flux de duplication et celle du basculement. Pour la règle de flux, deux méthodes sont possible : synchrone ou asynchrone. La duplication étant faite par envoi des données binaires du journal, la ou les serveurs cibles, doivent acquitter réception de l’envoi pour considérer toute transaction comme définitivement validée. En mode synchrone, il faut donc veiller à ce que la latence de communication soit minimale (quelques millisecondes tout au plus) sinon, cela tirerait les performances des requêtes de mise à jour vers le bas dans les bases sources (actives). On conviendra donc que le mode synchrone est adapté à un PCA plus qu’à un PRA, tandis que le mode asynchrone convient parfaitement au PRA (il est très courant d’établir les deux simultanément, en mode synchrone vers une instances locale et en mode asynchrone vers une autre instance distante).
Pour le basculement, il est possible d’activer le mode automatique uniquement si l’on est en flux synchrone, ce qui assure qu’il n’y aura aucune perte de données. En mode asynchrone, comme en mode synchrone, lorsqu’il y a perte de communication, le basculement ne peut plus qu’être manuel, car cela suppose d’assumer le risque d’une perte de données inconnue…
Enfin, comme les bases dupliquées sont lisible, certains les utilisent pour décharger la production de lectures lourdes comme c’est le cas de la récupération des informations pour alimenter un DataWarehouse ou bien plus simplement pour du reporting.

À noter que, les bases répliquées étant lisibles, on peut les utiliser pour y effectuer les sauvegardes…

Un groupe de disponibilité est dit primaire (PRIMARY) si ce groupe est actif et donc toutes les bases qu’il contient sont opérationnelles pour les lectures comme pour l’écriture. Sinon il est dit secondaire (SECONDARY) et toutes les bases qu’il contient sont des sources. De même pour une base, elle peut être considérée comme active si elle est dans le groupe primaire.

Enfin, vous avez dû voir fréquemment les lettres HADR et vous vous demandez ce que cela veut dire… C’est tout simplement l’acronyme de « High Availability Disaster Recovery » (Récupération de Désastre par Haute Disponibilité) et de nombreux objets dans SQL Server portent cet acronyme pour indiquer qu’ils participent à AlwaysOn. Pour en avoir la liste, vous pouvez faire la requête suivante :
SELECT *
FROM sys.all_objects
WHERE is_ms_shipped = 1
AND name LIKE '%hadr%'

Et maintenant nos fonctions…

/******************************************************************************
* MODULE : HADR_META                                                          *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : metadata functions for AHDR/AlwaysOn DB and AG visibility         *
*******************************************************************************
* VALID : FROM SQL Server 2012                                                *
******************************************************************************/

USE master;
GO

/*
DROP FUNCTION dbo.F_HADR_IS_PRIMARY_AG_BY_NAME;
DROP FUNCTION dbo.F_HADR_IS_PRIMARY_DB_BY_NAME;
DROP FUNCTION dbo.F_HADR_IS_PRIMARY_DB_BY_ID;
DROP FUNCTION dbo.F_HADR_IS_DB_INVOLVED_BY_ID;
DROP FUNCTION dbo.F_HADR_IS_DB_INVOLVED_BY_NAME;
DROP FUNCTION dbo.F_HADR_IS_DB_ACTIVE_BY_NAME;
DROP FUNCTION dbo.F_HADR_IS_DB_ACTIVE_BY_ID;
*/

CREATE FUNCTION dbo.F_HADR_IS_PRIMARY_AG_BY_NAME (@AG_NAME sysname) 
RETURNS BIT 
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_PRIMARY_AG_BY_NAME                            *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if an availability group is the active one or not        *
*******************************************************************************
* INPUTS :                                                                    *
*    @AG_NAME sysname : name of the availability group                        *
*******************************************************************************
* OUPUT : BIT (1 AG is primary, 0 AG is not primary, NULL AG does’nt exists)  *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT master.dbo.F_HADR_IS_PRIMARY_AG_BY_NAME('MyAG')                  *
******************************************************************************/
BEGIN 
RETURN
   CASE 
      WHEN NOT EXISTS(SELECT * 
                      FROM   sys.availability_groups 
                      WHERE  name = @AG_NAME COLLATE Latin1_General_CI_AI)
         THEN NULL
      WHEN EXISTS(SELECT *
                  FROM   sys.dm_hadr_availability_group_states AS ags
                         JOIN sys.availability_groups AS ag 
                            ON ag.group_id = ags.group_id
                  WHERE  ag.name 
                         = @AG_NAME COLLATE Latin1_General_CI_AI
                    AND  ags.primary_replica =  @@SERVERNAME)
         THEN 1
      ELSE 0
   END;
END;
GO

CREATE FUNCTION dbo.F_HADR_IS_PRIMARY_DB_BY_NAME (@DB_NAME sysname) 
RETURNS BIT
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_PRIMARY_DB_BY_NAME                            *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if a database is a PRIMARY one in an availability group  *
*******************************************************************************
* INPUTS :                                                                    *
*    @DB_NAME sysname : name of the database                                  *
*******************************************************************************
* OUPUT : BIT (1 DB is primary, 0 DB is not primary,                          *
*              NULL DB is not in an AG or does’nt exists)                     *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT name, master.dbo.F_HADR_IS_PRIMARY_DB_BY_NAME(name)              *
*     FROM   sys.databases                                                    *
******************************************************************************/
BEGIN
RETURN 
   CASE 
      WHEN NOT EXISTS(SELECT *
                      FROM   sys.databases as d
                      JOIN sys.dm_hadr_availability_replica_states as ars
                            ON d.replica_id = ars.replica_id
                      WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI)
         THEN NULL
      WHEN EXISTS(SELECT *
                  FROM   sys.databases as d
                         JOIN sys.dm_hadr_availability_replica_states as ars
                            ON d.replica_id = ars.replica_id
                  WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI 
                    AND  ars.role_desc = N'PRIMARY')
         THEN 1 
      ELSE 0 
   END;
END;
GO

CREATE FUNCTION dbo.F_HADR_IS_PRIMARY_DB_BY_ID (@DB_ID smallint) 
RETURNS BIT
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_PRIMARY_DB_BY_ID                              *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if a database is a PRIMARY one in an availability group  *
*******************************************************************************
* INPUTS :                                                                    *
*    @DB_ID smallint : numerical identifier of the database (database_id)     *
*******************************************************************************
* OUPUT : BIT (1 DB is primary, 0 DB is not primary,                          *
*              NULL DB is not in an AG or does’nt exists)                     *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT name, master.dbo.F_HADR_IS_PRIMARY_DB_BY_ID(database_id)         *
*     FROM   sys.databases                                                    *
******************************************************************************/
BEGIN
RETURN 
   CASE 
      WHEN NOT EXISTS(SELECT *
                      FROM   sys.databases as d
                      JOIN sys.dm_hadr_availability_replica_states as ars
                            ON d.replica_id = ars.replica_id
                      WHERE  d.database_id = @DB_ID)
         THEN NULL 
      WHEN EXISTS(SELECT *
                  FROM   sys.databases as d
                         JOIN sys.dm_hadr_availability_replica_states as ars
                            ON d.replica_id = ars.replica_id
                  WHERE  d.database_id = @DB_ID 
                    AND  ars.role_desc = N'PRIMARY')
         THEN 1 
      ELSE 0 
   END;
END;
GO

CREATE FUNCTION dbo.F_HADR_IS_DB_INVOLVED_BY_ID (@DB_ID smallint) 
RETURNS BIT
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_DB_INVOLVED_BY_ID                             *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if a database is involved in an availability group       *
*******************************************************************************
* INPUTS :                                                                    *
*    @DB_ID smallint : numerical identifier of the database (database_id)     *
*******************************************************************************
* OUPUT : BIT (1 DB is involved, 0 DB not involved, NULL DB does’nt exists)   *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT name, master.dbo.F_HADR_IS_DB_INVOLVED_BY_ID(database_id)        *
*     FROM   sys.databases                                                    *
******************************************************************************/
BEGIN
RETURN 
   CASE 
      WHEN NOT EXISTS(SELECT *
                      FROM   sys.databases as d
                      WHERE  d.database_id = @DB_ID)
         THEN NULL 
      WHEN EXISTS(SELECT *
                  FROM   sys.databases as d
                         JOIN sys.dm_hadr_availability_replica_states as ars
                            ON d.replica_id = ars.replica_id
                  WHERE  d.database_id = @DB_ID)
         THEN 1 
      ELSE 0 
   END;
END;
GO

CREATE FUNCTION dbo.F_HADR_IS_DB_INVOLVED_BY_NAME (@DB_NAME sysname) 
RETURNS BIT
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_DB_INVOLVED_BY_NAME                             *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if a database is involved in an availability group       *
*******************************************************************************
* INPUTS :                                                                    *
*    @DB_NAME sysname : name of the database                                  *
*******************************************************************************
* OUPUT : BIT (1 DB is involved, 0 DB not involved, NULL DB does’nt exists)   *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT name, master.dbo.F_HADR_IS_DB_INVOLVED_BY_NAME(name)             *
*     FROM   sys.databases                                                    *
******************************************************************************/
BEGIN
RETURN 
   CASE
      WHEN NOT EXISTS(SELECT *
                      FROM   sys.databases as d
                      WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI)
         THEN NULL 
      WHEN EXISTS(SELECT *
                  FROM   sys.databases as d
                         JOIN sys.dm_hadr_availability_replica_states as ars
                            ON d.replica_id = ars.replica_id
                  WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI)
         THEN 1 
      ELSE 0 
   END;
END;
GO

CREATE FUNCTION dbo.F_HADR_IS_DB_ACTIVE_BY_NAME (@DB_NAME sysname) 
RETURNS BIT
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_DB_ACTIVE_BY_NAME                             *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if a database is involved in an availability group       *
*******************************************************************************
* INPUTS :                                                                    *
*    @DB_NAME sysname : name of the database                                  *
*******************************************************************************
* OUPUT : BIT (1 DB is active, 0 DB not active, NULL DB does’nt exists)       *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT name, master.dbo.F_HADR_IS_DB_ACTIVE_BY_NAME(name)               *
*     FROM   sys.databases                                                    *
******************************************************************************/
BEGIN
RETURN 
   CASE 
      WHEN NOT EXISTS(SELECT *
                      FROM   sys.databases as d
                      WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI)
         THEN NULL
      WHEN 
         EXISTS(SELECT *
                FROM   sys.databases as d
                       LEFT JOIN sys.dm_hadr_availability_replica_states as ars
                          ON d.replica_id = ars.replica_id
                WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI
                  AND  ars.replica_id IS NULL
                UNION ALL
                SELECT *
                FROM   sys.databases as d
                       JOIN sys.dm_hadr_availability_replica_states as ars
                          ON d.replica_id = ars.replica_id
                WHERE  d.name = @DB_NAME COLLATE Latin1_General_CI_AI 
                  AND  ars.role_desc = N'PRIMARY')
         THEN 1 
      ELSE 0 
   END;
END;
GO

CREATE FUNCTION dbo.F_HADR_IS_DB_ACTIVE_BY_ID (@DB_ID smallint) 
RETURNS BIT
AS
/******************************************************************************
* MODULE : HADR_META                                                          *
* NATURE : SCALAR_FUNCTION                                                    *
* OBJECT : master.dbo.F_HADR_IS_DB_ACTIVE_BY_ID                             *
* CREATE : 2018-09-12                                                         * 
* VERSION : 1                                                                 *
*******************************************************************************
* Frédéric BROUARD  -  alias SQLpro  -   SARL SQL SPOT  -  SQLpro@sqlspot.com *
* Architecte de données :  expertise, audit, conseil, formation, modélisation *
* tuning, sur les SGBD Relationnels, le langage SQL, MS SQL Server/PostGreSQL *
* blog: http://blog.developpez.com/sqlpro  site: http://sqlpro.developpez.com *
* publication, révision du code Microsoft SQL Server : http://mssqlserver.fr/ *
*******************************************************************************
* PURPOSE : indicate if a database is involved in an availability group       *
*******************************************************************************
* INPUTS :                                                                    *
*    @DB_ID smallint : numerical identifier of the database (database_id)     *
*******************************************************************************
* OUPUT : BIT (1 DB is active, 0 DB not active, NULL DB does’nt exists)       *
*******************************************************************************
* SAMPLE :                                                                    *
*     SELECT name, master.dbo.F_HADR_IS_DB_ACTIVE_BY_ID(database_id)          *
*     FROM   sys.databases                                                    *
******************************************************************************/
BEGIN
RETURN 
   CASE
      WHEN NOT EXISTS(SELECT *
                      FROM   sys.databases as d
                      WHERE  d.database_id = @DB_ID)
         THEN NULL 
      WHEN 
         EXISTS(SELECT *
                FROM   sys.databases as d
                       LEFT JOIN sys.dm_hadr_availability_replica_states as ars
                          ON d.replica_id = ars.replica_id
                WHERE  d.database_id = @DB_ID
                  AND  ars.replica_id IS NULL
                UNION ALL
                SELECT *
                FROM   sys.databases as d
                       JOIN sys.dm_hadr_availability_replica_states as ars
                          ON d.replica_id = ars.replica_id
                WHERE  d.database_id = @DB_ID  
                  AND  ars.role_desc = N'PRIMARY')
         THEN 1 
      ELSE 0 
   END;
END;
GO

Toutes ces fonctions doivent être créées dans la base master.

Elles sont suffisamment documentées de manière internes pour que je n’ai pas besoin d’en dire beaucoup plus…

dbo.F_HADR_IS_PRIMARY_AG_BY_NAME :
Renvoie 0 ou 1 si le nom du groupe de disponibilité passé en argument est primaire ou secondaire, sinon NULL s’il n’existe pas.

dbo.F_HADR_IS_PRIMARY_DB_BY_NAME,
dbo.F_HADR_IS_PRIMARY_DB_BY_ID :
Renvoie 0 ou 1 si la base est primaire, sinon NULL si elle n’est pas enrôlée dans un groupe de disponibilité ou n’existe pas. L’argument pouvant être un nom de base ou un ID, suivant la fonction.

dbo.F_HADR_IS_DB_INVOLVED_BY_NAME,
dbo.F_HADR_IS_DB_INVOLVED_BY_ID :
Renvoie 0 ou 1 si la base est enrôlée ou non dans un groupe de disponibilité, sinon NULL si elle n’existe pas. L’argument pouvant être un nom de base ou un ID, suivant la fonction.

dbo.F_HADR_IS_DB_ACTIVE_BY_NAME,
dbo.F_HADR_IS_DB_ACTIVE_BY_ID :
Renvoie 0 ou 1 si la base est active, sinon NULL si elle n’existe pas. L’argument pouvant être un nom de base ou un ID, suivant la fonction.

NOTA : toutes ces fonctions doivent être créées sur toutes les instances participant aux différents groupes de disponibilité.

Travaux de l’Agent SQL

Maintenant que nous connaissons ces fonction, voici comment s’en servir dans l’agent…

Si un travail concerne un groupe de disponibilité et que vous devez le déclencher ou non suivant l’état de ce groupe, utilisez la fonction dbo.F_HADR_IS_PRIMARY_AG_BY_NAME comme première étape de votre plan.

Si un travail concerne une base enrôlée dans un groupe de disponibilité et que devez le déclencher ou non suivant l’état de cette base, utilisez l’une des fonctions dbo.F_HADR_IS_PRIMARY_DB_BY_NAME ou dbo.F_HADR_IS_PRIMARY_DB_BY_ID soit comme première étape de votre plan (traitement unitaire d’une base) ou comme filtre dans votre script (traitement global de plusieurs bases).

Si un travail concerne une base enrôlée dans un groupe de disponibilité, utilisez l’une des fonctions dbo.F_HADR_IS_INVOLVED_DB_BY_NAME ou dbo.F_HADR_IS_INVOLVED_DB_BY_ID soit comme première étape de votre plan (traitement unitaire d’une base) ou comme filtre dans votre script (traitement global de plusieurs bases).

Enfin, si un travail concerne une base qui doit être active (enrôlée ou non dans un groupe de disponibilité), utilisez l’une des fonctions dbo.F_HADR_IS_ACTIVE_DB_BY_NAME ou dbo.F_HADR_IS_ACTIVE_DB_BY_ID soit comme première étape de votre plan (traitement unitaire d’une base) ou comme filtre dans votre script (traitement global de plusieurs bases).

Le lien de téléchargement du code


Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
* Le site sur les SGBD relationnels et le SQL : https://sqlpro.developpez.com *
* le blog SQL, SQL Server, SGBDR... sur : https://blog.developpez.com/sqlpro/ *
* Expert Microsoft SQL Server, MVP (Most valuable Professional) depuis 14 ans *
* Entreprise SQL SPOT : modélisation, conseil, audit, optimisation, formation *
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *

Ce contenu a été publié dans Requêtes de métadonnées. Vous pouvez le mettre en favoris avec ce permalien.