tables Histoire avantages, les inconvénients et les pièges - à l'aide de déclencheurs, sproc ou au niveau d'application [fermé]

StackOverflow https://stackoverflow.com/questions/1250507

Question

Je suis en train de jouer avec l'idée d'avoir des tables d'histoire pour certains de mes tables dans ma base de données. Fondamentalement, j'ai la table principale et une copie de cette table avec une date de modification et une colonne d'action pour stocker ce que l'action a été mise à jour par exemple préformées, supprimer et insérer.

Jusqu'à présent, je peux penser à trois endroits différents que vous pouvez faire le travail de table d'historique.

  • Déclencheurs sur la table principale pour la mise à jour, insérer et supprimer. (Base de données)
  • Procédures stockées. (Base de données)
  • couche d'application. (Application)

Ma principale question est, quels sont les avantages, les inconvénients et gotchas de faire le travail dans chacune de ces couches.

L'un des avantages que je peux penser en utilisant la façon dont les déclencheurs est que l'intégrité est toujours maintenue, peu importe ce que le programme est implmentated au-dessus de la base de données.

Était-ce utile?

La solution

Je mettrais cette façon:

  • : procs stockées ils sont contournées si vous modifiez la table directement. Sécurité sur la base de données peut contrôler ce
  • Application: même affaire. Aussi, si vous avez plusieurs applications, peut-être dans des langues différentes, il doit être mis en œuvre dans chaque pile, qui est un peu redondant; et
  • Triggers: transparent à l'application et saisira toutes les modifications. Ceci est ma méthode préférée.

Autres conseils

Les déclencheurs sont le plus rapide et plus simple pour atteindre l'histoire simple. Les informations suivantes suppose un exemple plus complexe où le traitement de l'histoire peut inclure des règles commerciales et peut exiger des informations de consignation ne figurent pas dans la table en cours suivi.

Pour ceux qui pensent que les déclencheurs sont plus sûrs que sprocs parce qu'ils ne peuvent pas être contournées je leur rappelle qu'ils font l'hypothèse suivante:

!

) Permission existent que les utilisateurs d'arrêt d'exécuter DISABLE TRIGGER [mais les autorisations peuvent aussi exister pour limiter tout accès à la base de données, sauf pour Executer sur sprocs qui est un modèle commun pour les applications d'entreprise] - donc il faut prendre des autorisations correctes et sprocs donc déclencheurs égaux en termes de sécurité et sa capacité à être contournée

!) En fonction de la base de données, il peut être possible d'exécuter des instructions de mise à jour qui ne se déclenche pas les déclencheurs. Je pourrais tirer profit de la connaissance de la profondeur d'exécution de déclenchement imbriquée pour contourner un déclencheur. La seule solution sûre comprend la sécurité dans la base de données et de limiter l'accès aux données à l'aide des mécanismes Approuvés -. Si ceux-ci soient des déclencheurs, des sprocs ou des couches d'accès aux données

Je pense que les choix sont clairs ici. Si les données sont en cours d'accès par de multiples applications vous voulez contrôler l'histoire de la plus basse couche commune et cela signifie que la base de données.

Suite à la logique ci-dessus, le choix des déclencheurs ou des procédures stockées dépend à nouveau si la procédure stockée est la plus basse couche commune. Vous devriez préférer le sproc sur la détente que vous pouvez contrôler les performances et les effets secondaires mieux et le code est plus facile à maintenir.

Triggers sont acceptables, mais essayez de vous assurer que vous ne pas augmenter les verrous en lisant des données en dehors des tables mises à jour. Limite déclenche à l'insère dans les tables de journaux, connectez-vous seulement ce que vous devez.

Si l'application utilise une couche d'accès logique commune et il est peu probable que cela change au fil du temps, je préférerais mettre en œuvre la logique ici. Utilisez une chaîne de modèle de responsabilité et une architecture de plug-in, conduire ce de l'injection de dépendances pour permettre toutes sortes de traitement en vous module d'histoire, y compris l'exploitation forestière à des types complètement différents de la technologie, des bases de données différentes, un service d'histoire ou toute autre chose que vous pourrait imaginer.

avez utilisé l'élément déclencheur d'approche basée sur des années et il a certainement bien fonctionné pour nous, mais vous avez les points suivants à réfléchir sur:

  1. Déclenche sur un très utilisé (par exemple, une application SaaS multi-locataires) pourrait être extrêmement coûteux

  2. Dans certains scénarios, quelques champs peuvent obtenir redondants. Déclencheurs sont bonnes que lorsque vous êtes très clair sur les champs à journaliser; mais en utilisant une application que vous pourriez avoir une couche d'intercepteurs qui pourraient vous aider à ouvrir une session certains champs en fonction de la « configuration »; mais avec sa propre part des frais généraux

  3. Sans contrôle de la base de données adéquate, une personne pourrait facilement désactiver les déclencheurs, modifier les données et activer les déclencheurs; tous sans soulever aucune alarme

  4. Dans le cas des applications Web, où les connexions sont établies à partir d'une piscine, le suivi des utilisateurs réels qui ont fait les changements peuvent être fastidieux. Une solution possible serait d'avoir le champ "EditedBy" dans toutes les tables de transaction.

une fin mais il ajoute deux autres options qui peuvent être envisagées.

Change Data Capture: Cette fonction est disponible dans SQL Server 2008 R2 + mais seulement dans l'édition d'entreprise. Il vous permet de sélectionner les tables que vous souhaitez suivre et SQL Server fera le travail pour vous. Il fonctionne en lisant journal des transactions et de remplir les tables d'historique des données.

Lecture journal des transactions: Si la base de données est en mode de récupération complète puis journal des transactions peut être lu et les détails sur les transactions presque introuvable.

du côté incliné est que ce n'est pas pris en charge par défaut. Les options sont à lire journal des transactions en utilisant des fonctions non documentées comme des outils fn_dblog ou de tiers tels que ApexSQL Log .

Triggers: Fonctionne très bien pour petit nombre de tables où il n'y a pas trop de déclencheurs pour gérer. Si vous avez beaucoup de tables que vous souhaitez auditer alors vous devriez envisager un outil tiers pour cela.

Tous ces travaux au niveau de la base de données et sont complètement transparents à l'application.

Les déclencheurs sont le seul moyen fiable pour saisir les changements. Si vous le faites dans ou procédures stockées l'application, vous pouvez toujours aller et SQL loin un changement que vous ne disposez pas d'un journal (inadvertantly). Bien sûr, quelqu'un qui ne veut pas laisser un journal peut désactiver les déclencheurs. Mais vous préférez forcer quelqu'un à désactiver l'enregistrement que l'espoir qu'ils se souviennent de l'inclure.

En général, si vous choisissez la couche d'application, vous pouvez concevoir votre code d'application pour faire l'enregistrement en un seul point, qui traitera marmonnait tout votre table historique. différemment déclencheurs sont une approche plus compliquée à maintenir parce qu'ils sont (selon la technologie db) reproduit pour chaque table: en cas de centaines de tables la quantité de code pour le déclencheur coud un problème.

si vous avez une organisation de soutien qui maintiendra le code que vous écrivez maintenant, et vous ne savez pas qui maintiendra votre code (tipical pour les grandes industries) vous ne pouvez pas supposer ce qui est le niveau de compétence de la personne qui fera fixer sur votre demande, dans ce cas il vaut mieux à mon avis, de faire la table historique principe de fonctionnement aussi simple que possible, et la couche d'application est probablement le meilleur endroit à cet effet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top