Comment surveiller SQL Server le tableau des modifications à l'aide de c#?
J'ai plus d'une application d'accéder à la même DB et j'ai besoin d'être averti si l'une de ces applications changer quoi que ce soit (update, insert) dans une table.
Base de données et les applications ne sont pas sur le même serveur.
- Ce type de notification avez-vous besoin? Immédiate? Avez-vous besoin d'une application pour en être informé, ou avez-vous besoin d'un e-mail envoyé pour vous? Avez-vous vraiment besoin d'être informés, ou voulez-vous simplement à suivre ces changements?
- Vous pourriez tenir autour de la prochaine fois après vous poser une question si vous pouvez apporter des clarifications/interagir avec le answerers. AINSI, les utilisateurs sont méchants rapide à répondre, et que vous perdez une bonne occasion pour obtenir les bonnes réponses, si vous n'avez pas "planer" au-dessus de votre question en attente de réponse.
- j'ai juste besoin de savoir si n'importe quelle autre application de mise à jour ou d'insérer toutes les données , je n'ai pas de besoin de données juste un drapeau que ce tableau a de nouveaux changements. désolé pour le retard je na sais que les réponses sont rapides comme ça
- Pas de problème. AINSI, la culture prend une certaine habitude. Il est différent de tous les autres Q & A ou forum que j'ai jamais vu.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
SqlDependency Classe
. Son utilisation est principalement pour ASP.NET pages (faible nombre de notifications client).Mettre en œuvre les
OnChange
de l'événement afin d'être prévenu:Et dans le code:
Il utilise le
Service Broker
(un message de communication basé sur la plate-forme) pour recevoir des messages à partir du moteur de base de données.SqlSependency
si il ya une meilleure façon que ceci afin de recevoir des notifications lorsque de données SQL Azure à des changements ou lorsque de nouvelles données sont insérées ?Dans l'intérêt de l'exhaustivité, il existe deux autres solutions (à mon avis) sont plus orthodoxe que de solutions en s'appuyant sur le SqlDependency (et SqlTableDependency) des classes. SqlDependency a été conçu à l'origine pour rafraîchissants, distribué serveur web caches plus facile, et donc a été construit à un ensemble différent de conditions que s'il avait été conçu comme un organisateur de l'événement.
Il y a largement de quatre options, dont certaines n'ont pas été abordés ici déjà:
Le suivi des modifications
Source: https://docs.microsoft.com/en-us/sql/relational-databases/track-changes/about-change-tracking-sql-server
Le suivi des modifications est un léger mécanisme de notification dans SQL server. Fondamentalement, une base de données à l'échelle de numéro de version est incrémenté à chaque modification de toutes les données. Le numéro de version est écrite pour le suivi des modifications des tables avec un masque de bits, y compris les noms des colonnes qui ont été modifiés. Remarque, le changement n'est pas conservée. La notification ne contient que les informations qu'une entité de données a changé. En outre, parce que la table de changement de contrôle de version est cumulative, des notifications de changement sur les éléments individuels ne sont pas conservées et sont remplacées par de nouvelles notifications. Cela signifie que si une entité change deux fois, le suivi des modifications ne sais à propos de la modification la plus récente.
Afin de capturer ces changements en c#, les bureaux de vote doivent être utilisés. Les tables de suivi des modifications peuvent être interrogés et chaque changement inspectés pour voir si il est de l'intérêt. S'il est de l'intérêt, il est nécessaire d'accéder directement aux données à récupérer l'état actuel.
De Capture De Données Modifiées
Source: https://technet.microsoft.com/en-us/library/bb522489(v=sql.105).aspx
De capture de données modifiées (CDC) est plus puissant mais plus coûteux que le suivi des modifications. La capture de données modifiées permettra de suivre et de notifier les modifications basées sur le suivi de la base de données du journal. En raison de cette CDC a accès aux données qui ont été modifiées, et conserve une trace de toutes les modifications individuelles.
De même pour le suivi des modifications, dans le but de capturer ces changements en c#, les bureaux de vote doivent être utilisés. Toutefois, dans le cas de la CDC, les sondés information contiendra les détails de changements, de sorte qu'il n'est pas strictement nécessaire de revenir à la donnée elle-même.
Des déclencheurs pour les files d'attente
Source: https://code.msdn.microsoft.com/Service-Broker-Message-e81c4316
Cette technique dépend de déclencheurs sur les tables à partir de laquelle les notifications sont nécessaires. Chaque changement va déclencher un trigger et de la détente écrire cette information à un service de courtier en file d'attente. La file d'attente peut être connecté via C# à l'aide du Service Broker de Message Processeur (exemple dans le lien ci-dessus).
À la différence du suivi des modifications ou des CDC, des déclencheurs pour les files d'attente ne s'appuient pas sur l'interrogation et fournit ainsi en temps réel de concours complet.
CLR
C'est une technique que j'ai vu utilisé, mais je ne le recommanderais pas. Toute solution qui repose sur la CLR de communiquer à l'extérieur est un hack au mieux. Le CLR a été conçu pour rendre l'écriture complexe de traitement de données de code plus facile en tirant parti de C#. Il n'a pas été conçu pour le fil de fer dans des dépendances externes, comme la messagerie bibliothèques. En outre, CLR opérations liées pouvez rompre dans des environnements en cluster de manière imprévisible.
Cela dit, il est assez simple à mettre en place, comme tout ce que vous devez faire est de vous inscrire à la messagerie de l'assemblée avec CLR et puis vous pouvez appeler à tout moment à l'aide de déclencheurs ou SQL emplois.
En résumé...
Il a toujours été une source d'étonnement pour moi que Microsoft a catégoriquement refusé d'aborder ce problème de l'espace. Concours complet à partir de la base de données de code devrait être une fonctionnalité intégrée de la base de données produit. Considérant que l'Oracle de files d'attente Avancé combiné avec l'ODP.net MessageAvailable événement base de données fiable de concours complet à C# plus de il y a 10 ans, c'est lamentable de MME
La conséquence de cela est qu'aucune des solutions présentées à cette question sont très gentils. Ils ont tous des inconvénients techniques et ont un important coût d'installation. Microsoft si vous êtes à l'écoute, merci de régler ce triste état de choses.
En général, vous pouvez utiliser Service Broker
Qui est déclencheur -> file -> application(s)
Modifier, après avoir vu les autres réponses:
FYI: "les Notifications de Requête" est basé sur le Service broker
Edit2:
Plus de liens
SqlSependency
si il ya une meilleure façon que ceci afin de recevoir des notifications lorsque de données SQL Azure à des changements ou lorsque de nouvelles données sont insérées ?Utilisation SqlTableDependency. C'est un composant visual c# d'événements de collecte lorsqu'un enregistrement est en changements.
Vous pouvez en trouver d'autres détails: https://github.com/christiandelbianco/monitor-table-change-with-sqltabledependency
Il est similat pour .NET SqlDependency sauf que SqlTableDependency déclencher des événements contenant modifié /supprimé ou mis à jour de la base de données des valeurs de la table:
SqlDependency ne regarde pas la base de données, il regarde le SqlCommand vous spécifiez donc, si vous essayez d'permet de dire d'insérer des valeurs dans la base de données dans 1 projet de capture et de l'événement dans un autre projet, ça ne marchera pas parce que l'événement était de la SqlCommand de la 1º projet de la base de données car, lorsque vous créez un SqlDependency vous lier à un SqlCommand et uniquement lorsque la commande à partir de ce projet permet la création d'un événement de Changement.
Être prudent en utilisant SqlDependency classe a problèmes avec des fuites de mémoire.
Il suffit d'utiliser un cross-plateforme .NET 3.5, .NET de Base compatible et solution open source - SqlDependencyEx. Vous pouvez obtenir des notifications ainsi que les données qui ont été modifiés (vous pouvez y accéder par le biais des propriétés dans un événement de notification de l'objet). Vous pouvez également tack SUPPRIMER\UPDATE\les opérations d'INSERTION-les ensemble ou séparément.
Voici un exemple de comment il est facile à utiliser SqlDependencyEx:
Veuillez suivre les liens pour plus de détails. Ce composant a été testé dans de nombreuses applications de niveau entreprise et fiables. Espérons que cette aide.
Depuis SQL Server 2005, vous avez la possibilité d'utiliser Les Notifications De Requête, qui peut être exploité par ADO.NET voir
http://msdn.microsoft.com/en-us/library/t9x04ed2.aspx
ressemble à une mauvaise architecture de toute façon. aussi, vous n'avez pas spécifié le type d'application que vous devez notifier à (web app /console app /winforms /service, etc etc)
néanmoins, pour répondre à votre question, il y a plusieurs façons de résoudre ce. vous pouvez utiliser:
1) les horodatages si vous êtes seulement intéressé à s'assurer que la prochaine série de mises à jour à partir de la deuxième application n'conflit avec les mises à jour à partir de la première application
2) dépendance sql de l'objet - voir http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldependency.aspx pour plus d'info
3) une coutume service de notification push qui de plusieurs clients (web /winform /service) peuvent s'inscrire et être averti sur les changements
en bref, vous devez utiliser le plus simple et le plus facile et le moins cher (en termes d'efforts) solution basée sur le degré de complexité de vos exigences en matière de notification sont et dans quel but vous avez besoin de les utiliser. ne pas essayer de construire une trop complexe système de notification si simple de données de simultanéité est votre seule exigence (dans ce cas, pour un aller simple basé sur un horodateur solution)
L'autre, de manière très simple des tableaux de suivi de la table de gestion des versions. Le système est prouvée à travailler dans des constructions telles que les DNS de synchronisation. Pour le faire fonctionner, vous créez un tableau contenant les noms de table et de la table de versions que de
decimal
oubigint.
Dans chaque table que vous avez besoin de surveiller, create trigger sur insert, update et delete qui s'incrémente approprié version de table en gestion des versions de la table lors de l'exécution. Si vous vous attendez tout de la surveillance des tables à être changée souvent, vous avez besoin à disposition pour la version de le réutiliser. Enfin, dans votre application, à chaque fois que vous interrogez suivis de la table, vous avez également la requête de sa version et de les stocker. Quand vous allez à modifier la surveillance de la table à partir de votre application, vous devez d'abord interroger sa version actuelle et le processus de changement que si la version est inchangé. Vous pouvez avoir des procédures stockées sous sql server faire ce travail pour vous.C'est extrêmement simple mais éprouvée de la solution solide. Il est spécifique à l'utilisation fonctionnelle (afin de s'assurer de la cohérence des données) et la lumière sur les ressources (vous ne soulevez pas l'entremise d'un courtier d'événements qui vous ferait pas de regarder pour), mais les besoins de l'application à contrôler activement les changements plutôt que d'attendre passivement pour l'événement de se produire.