Nous avons un fournisseur tiers essayant d'intégrer 2 applications différentes où les deux bases de données résident sur notre instance SQL Server avec plus de 150 autres bases de données, et ils veulent créer un travail MSDB pour "synchroniser" les 2 applications différentes toutes les 5 minutes (au début, ils voulait l'exécuter toutes les minutes).
Mon intuition initiale est qu'ils devraient plutôt le faire d'une manière ou d'une autre dans le niveau Application avec un travail planifié Windows, ou peut-être même un déclencheur redouté (auquel nous avons généralement recours dans des situations comme celle-ci).
Je préfère garder les travaux MSDB réservés aux tâches DBA autant que possible pour réduire l'encombrement là-bas, et j'ai également rencontré des requêtes lentes de MSDB lors de l'affichage des historiques de travaux avec des travaux super actifs comme celui-ci (qui noient et suppriment également les historiques de travail importants de des choses plus importantes comme les historiques de sauvegarde). Mais là encore, mes préférences sont peut-être erronées et je dois faire de la place pour le niveau Application dans MSDB et retrousser mes manches et résoudre les problèmes d'historique de travail prenant une éternité à charger lorsque j'ai besoin de conserver beaucoup plus d'entrées d'historique pour capturer le des choses importantes comme les sauvegardes (ou purger les entrées de travail hyper actives).
Un autre problème que j'ai est que je dois maintenant donner à ce fournisseur des droits "administrateur système" au lieu de seulement des droits "dbo" sur leurs bases de données uniquement lorsqu'ils effectuent leurs mises à niveau via leur interface graphique et j'espère qu'ils ne feront pas exploser l'instance où ma mission est critique Les DB sont (l'un des inconvénients de la consolidation).
Je suppose que je peux les mettre sur une autre instance "isolée" où nous mettons tous les fournisseurs qui ne jouent pas bien, mais nous devons ensuite reconfigurer les applications pour pointer vers la nouvelle instance SQL ( soupir malheureusement pas trivial dans ce cas).
Le vendeur a déjà repoussé mes préoccupations en parlant de la gravité des déclencheurs. Donc, j'ai "googlé" un peu sur ce sujet et suis venu vide. Quelqu'un a-t-il vu un lien "faisant autorité" selon lequel c'est une mauvaise idée et je peux y faire référence? Ou devrais-je adopter leur approche?
Je ne pense pas avoir déjà posté dans un forum sql avant de demander de l'aide, donc j'espère que ma demande est correctement formulée.
EDIT: Nous exécutons SQL Server 2008 Enterprise R2 x64 SP1 (Merci d'avoir souligné que j'ai oublié de mentionner la version!). Hmmm, j'espère qu'ils n'ont pas besoin de changer leurs scripts de mise à niveau MSDB lorsque nous passerons à une version plus récente.
Merci pour votre temps! Riches
sysadmin
permettre de modifier les travaux de l'agent SQL - consultez msdn.microsoft.com/en-us/library/ms188283(v=sql.105).aspxRéponses:
OMI, votre fournisseur est en fait sur la bonne voie.
Un travail de couche application l'obligerait à refaire de nombreuses fonctionnalités prêtes à l'emploi de l'Agent SQL (par exemple, la logique de ne pas exécuter un travail déjà en cours d'exécution, de proposer une solution de stockage des informations d'identification et de sécurité, d'intégrer les résultats du travail avec rapport d'erreurs et suivi des résultats dans SQL etc etc etc etc). Et, plus important encore, fournissez une solution de sauvegarde / HA / DC pour la planification. Vous ne voulez pas que votre histoire de reprise après sinistre soit «et après avoir terminé la récupération du serveur de secours, créez ces 50 tâches de planificateur NT». Il a donc raison de repousser l'utilisation du planificateur système, il n'a rien des fonctionnalités et des capacités de l'agent.
Il a d'autant plus raison de repousser les déclencheurs. Le remplacement d'un travail périodique par un déclencheur synchrone augmente la latence des demandes, augmente la cohésion et le couplage (pensez aux changements de schéma ...), augmente le risque d'indisponibilité en raison de problèmes de synchronisation (erreur de déclenchement-> erreur d'application vs erreur de travail-> correction et réessayer plus tard) , augmente considérablement les problèmes de blocage (en raison de mises à jour croisées entre tracked / trackee) et a beaucoup plus de problèmes.
La solution la plus simple est en effet un travail d'agent et
msdb
n'est en aucun cas réservée aux DBA. Une solution plus sophistiquée consisterait à utiliser des minuteries de conversation et une activation interne , ce qui aurait certains avantages par rapport aux tâches d'agent, principalement en raison du confinement (tout se trouve dans la base de données d'application, pensez à la mise en miroir de scénarios de basculement), mais je peux totalement comprendre si votre fournisseur est réticents à essayer quelque chose qui nécessite un savoir-faire très spécifique. BTW J'espère que vous ne voulez pas dire un travail toutes les 5 minutes par DB .Quant aux autorisations sysadmin: le nom du jeu est la signature de code . Vous pouvez donner n'importe quelle autorisation à des procédures spécifiques, inspectées et validées par vous, en les signant avec votre certificat privé.
la source
Ma préférence personnelle serait d'utiliser des déclencheurs pour gérer au moins une partie de la synchronisation. Je ne me soucie pas particulièrement de la synchronisation des interrogations planifiées, car vous devez gérer les conflits potentiels, les données périmées, l'impact sur les performances de la tâche répétée, etc. S'ils veulent le faire de manière aussi agressive que 1 à 5 minutes, je suppose c'est pour atténuer les conflits et l'obsolescence, et l'immédiateté d'un déclencheur réglerait cela.
Si tout se passe sur le même serveur, vous pouvez probablement placer le code de synchronisation dans les déclencheurs ou demander aux déclencheurs d'appeler une procédure stockée qui synchronise chaque enregistrement affecté. Si la synchronisation s'étend sur les serveurs, ou si vous voulez vous assurer qu'une base de données hors ligne n'empêchera pas l'autre base de données d'être utilisable, envisagez d'utiliser Service Broker pour gérer les mises à jour asynchrones. J'ai fait cela pour synchroniser les chiffres de saisie des ventes avec les données CRM entre deux serveurs différents, tout en permettant à l'un ou l'autre des serveurs d'être mis hors ligne sans affecter l'autre application. Une fois qu'il est de retour, Service Broker remet les messages et met à jour les données sur le serveur distant.
Et il n'y a vraiment rien de intrinsèquement mauvais à propos des déclencheurs, mais comme la plupart des aspects de T-SQL, il est très possible d'écrire du code qui fonctionne horriblement. J'ai écrit un article sur les pièges courants des déclencheurs, si cela aide.
Écrire des déclencheurs bien comportés
la source