2009-12-30 8 views
2

J'écris une application de console C++ qui doit répondre à un changement dans un champ spécifique d'une table de base de données. Bien que je puisse continuer à envoyer une requête pour vérifier périodiquement le champ, j'aimerais éviter cela car plusieurs instances de cette application peuvent être en cours d'exécution. J'ai entendu parler de la fonctionnalité de notification de requête de SQL Server 2005 mais il semble que la fonctionnalité ne serait pas disponible pour mon paramètre (SQL Server 2000). Dans ce cas, quel serait le meilleur moyen d'obtenir cette fonctionnalité?Quel serait le meilleur moyen de notifier une application (C++ ou Java) lors d'une modification de base de données?

Répondre

0

Je pense que vous devriez utiliser des déclencheurs pour cela.

Lorsque le champ de table est modifié, le déclencheur est déclenché et informe l'autre application à l'aide de n'importe quel mécanisme IPC ou écrit les informations nécessaires dans les fichiers de registre ou temporaires.

+0

Pourriez-vous être plus précis? Comment puis-je utiliser des déclencheurs pour notifier une application? Merci. –

1

Voici comment je le ferais.

Vous avez votre application de console qui est responsable de vérifier quand la valeur d'une colonne spécifique d'une table change n'importe où dans cette colonne (mettre à jour, supprime, insère, peu importe).

Étape 1 - ne pointe pas que l'application de la console au DB, créez un MSMQ et le faire paraître il

Étape 2 - créer une deuxième application de la console dont la seule tâche est est d'écrire une valeur à la ci-dessus MSMQ

étape 3 - Créer un déclencheur sur la table en question pour exécuter l'application de la console à partir de l'étape 2.

3

Vous ne pouvez interroger des changements périodiquement. Il n'y a absolument aucun moyen d'obtenir des notifications de SQL Server 2000. Toutes les affirmations contraires sont des chimères.

Les déclencheurs qui effectuent une sorte de notification externe, via une automatisation OLE (sp_oa methods), via des procédures étendues, via xp_cmdshell ou quelque chose comme ça ne vont pas fonctionner. Il y a d'abord le problème des performances: la dernière chose que vous voulez que votre base de données fasse est de bloquer les déclencheurs en attente de réponse des processus externes. Deuxièmement, il y a ce petit détail d'exactitude habituellement ignoré dans un environnement transactionnel: toute notification envoyée pendant un déclencheur devrait être «non envoyée» si la transaction englobante est annulée. La seule façon d'y parvenir est de s'inscrire dans une transaction distribuée avec le mécanisme de notification (MSMQ par exemple) et cela signifie une baisse du débit de centaines/milliers par seconde à un seul chiffre.

N'y allez pas. Effectuez une mise à niveau vers SQL 2005 et utilisez QN, qui est le seul mécanisme de notification de modification active. Ou se contenter d'un sondage périodique des derniers changements.

+0

Chaque instance du mot * pull * doit être * poll *. – wallyk

+0

Vous pouvez éditer et corriger les fautes de frappe et la grammaire wally, ça ne me dérange pas –

+0

"toute notification envoyée lors d'un déclencheur devrait être" non envoyé "si la transaction englobante est annulée". Pas nécessairement vrai avec la bonne sémantique: un message disant "quelque chose a peut-être changé, vous devriez interroger le DB maintenant" ne doit pas être annulé en cas d'échec. Mais si elle est envoyée avant que la transaction ne soit validée, j'imagine que vous auriez un problème insoluble différent, que vous pourriez agir trop tôt. –

Questions connexes