Contexte :
Nous essayons de créer un faisceau de test AG «principal» pour l'une de nos équipes d'assistance. Ne sachant pas quels serveurs à un moment donné seront les principaux auxquels ils ont été chargés d'exécuter le TSQL sur un groupe de serveurs enregistré. Le groupe de serveurs enregistrés comprend tous les serveurs de l'AG. L'objectif est d'exécuter TSQL uniquement sur le serveur principal actuel:
Harnais de test actuel :
IF EXISTS (SELECT *
FROM sys.dm_hadr_availability_replica_states AS HARS
INNER JOIN sys.dm_hadr_availability_replica_cluster_states AS HACS ON HACS.replica_id = HARS.replica_id
WHERE (HARS.role_desc = 'PRIMARY') AND (HACS.replica_server_name LIKE @@SERVERNAME))
BEGIN
<<SOME CODE TO EXECUTE>>
END
Problème :
Si le premier serveur qui répond à la requête multi-serveur ne renvoie aucun résultat, SSMS supposera que le bon jeu de résultats n'est pas un jeu de résultats, même si d'autres serveurs reviennent plus tard avec un jeu de résultats. Donc, dans ce scénario, aucun résultat n'est renvoyé ... ce n'est pas correct et ce n'est pas la fonctionnalité attendue.
Quelqu'un peut-il penser à un moyen, avec SSMS (c'est l'outil le plus familier pour l'équipe CS), de forcer l'exécution uniquement sur le serveur principal actuel?
la source
Réponses:
J'ai déjà rencontré ce ** avant, et si je me souviens bien, pour vous assurer d'obtenir toujours des résultats avec des requêtes multi-serveurs, vous devez forcer un ensemble de résultats vide lorsqu'aucune ligne ne serait retournée autrement.
ELSE
Cela signifie que vous avez besoin d'une branche à ce sujetIF
et queELSE
vous feriez quelque chose comme ceci:Cela produit un jeu de résultats vide qui a les noms et les types de données appropriés.
OU, et je n'ai pas essayé cela dans le passé (je l'ai juste pensé en tapant ceci), mais vous pourriez peut- être vous en sortir simplement en faisant une pause dans cette
ELSE
branche de telle sorte que le serveur principal / prévu soit toujours autorisé à renvoyer son résultat défini en premier (ce qui est le vrai problème ici: le premier serveur à répondre définit la structure à laquelle toutes les autres réponses doivent adhérer). Par conséquent, ce qui suit pourrait fonctionner comme la seule chose dans leELSE
:Mais je ne me souviens pas si le fait que d'autres serveurs ne retournent aucun résultat provoquait l'affichage d'un message d'erreur dans l'onglet "Messages". Si cela se produit, le jeu de résultats vide est définitivement la voie à suivre. Mais si cela fonctionne, cela pourrait mieux fonctionner dans un modèle général (comme votre cas semble l'être) car cela ne nécessiterait pas d'ajuster le jeu de résultats forcé et vide chaque fois qu'il est utilisé.
MISE À JOUR:
Le PO a vérifié que:
WAITFOR DELAY
avez fait travailler, et** La situation que j'ai rencontrée était similaire, mais n'avait rien à voir avec les groupes de disponibilité ou le fait de vouloir des résultats provenant d'un seul serveur. Notre situation était que nous avions 18 serveurs de données de schéma différent et que nous devions effectuer diverses tâches de maintenance, agrégations sur les 18 nœuds. Il y avait des procédures stockées qui, pour une raison quelconque, ne retournaient parfois aucun ensemble de résultats, et quelle que soit la raison, il ne pouvait pas être corrigé dans la procédure stockée. Ainsi, en fonction du nœud renvoyé en premier, la plupart du temps tout allait bien, mais de temps en temps le nœud qui ne renvoyait parfois aucun jeu de résultats revenait en premier. Donc, je devais faire quelque chose comme vider les résultats dans une table temporaire et si
@@ROWCOUNT
celaINSERT...EXEC
était 0, alors je choisirais le résultat forcé, ensemble vide.la source
WAITFOR DELAY
approche et que vous avez confirmé qu'elle fonctionnait, alors merci pour ça!J'ai toujours utilisé une table temporaire pour renvoyer des résultats afin d'obtenir des réponses cohérentes de tous les serveurs d'un groupe. Les requêtes multi-serveurs sont l'une de mes choses préférées sur SSMS.
la source