J'ai besoin de déterminer si une base de données sur MS SQL Server a changé entre deux moments distincts. La modification peut être structurelle ou liée aux données et la vérification doit être générique (c'est-à-dire indépendante de la structure de la base de données). De préférence, j'aimerais que la vérification soit basée sur T-SQL ou sur SMO, et non sur un fichier. J'ai vérifié sur MSDN mais je n'ai rien trouvé de pertinent jusqu'à présent.Comment déterminer si une base de données a été modifiée ou non?
Répondre
Red Gate font deux produits qui pourraient vous intéresser:
Ils peuvent comparer la version actuelle de la base de données avec une copie de sauvegarde et trouver des changements dans le schéma ou des données respectivement.
Nous utilisons effectivement SQL Compare et c'est un très bon produit. Mais ici, je voulais dire par programme, soit dans T-SQL ou à partir du serveur d'application en utilisant SMO. – Locksfree
Pour les modifications structurelles, vous pouvez envisager d'enregistrer les événements DDL sur votre serveur en utilisant DDL triggers ou Service Broker. Cependant, l'identification des changements de données pourrait être beaucoup plus difficile à réaliser à moins d'avoir quelque chose à comparer. Je peux penser à Database Snapshot comme une solution possible (nécessite Enterprise Edition).
Pour SQL Server 2005 et jusqu'à vous pouvez ajouter un déclencheur DDL, comme:
CREATE TRIGGER [YourDatabaseTrigger]
ON DATABASE
FOR DDL_EVENTS
AS
DECLARE @EventData xml
DECLARE @Message varchar(1000)
SET @EventData=EVENTDATA()
INSERT INTO YourLogTable
(EventDateTime,EventDescription)
VALUES (GETDATE(),SUSER_NAME()
+'; '[email protected]('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(250)')
+'; '[email protected]('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(250)')
+'; '[email protected]('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
)
RETURN
GO
ENABLE TRIGGER [YourDatabaseTrigger] ON DATABASE
Vous devrez alors créer un déclencheurs (pour INSERT/UPDATE/DELETE) sur chaque table dans la base de données qui insérer dans la même table:
CREATE TRIGGER YourTableTrigger On YourTable
FOR INSERT
AS
INSERT INTO YourLogTable
(EventDateTime,EventDescription)
SELECT GETDATE(),SUSER_NAME()
+'; INSERT YourTable'+
+'; data='+...your column data here...
FROM INSERTED
GO
une solution possible pour le scénario que vous avez décrit est de lire le journal des transactions de base de données (fichier LDF). Toutes les modifications, tant sur le schéma que sur le niveau de données, qui ont été validées par rapport à la base de données sont enregistrées dans le journal des transactions de la base de données. Maintenant, comment lire les informations contenues dans le t-log?
Vous pouvez utiliser les fonctions natives SQL Server de fn_dblog, DBCC PAGE ou fn_dump_dblog ou un outil 3ème partie. Cependant, les fonctions natives ne sont pas documentées et il est très difficile de comprendre les résultats qu'elles fournissent. En ce qui concerne un outil 3ème partie, vous pouvez vérifier la Open LDF file and view LDF file content article en ligne pour plus de détails et une analyse plus approfondie de ce qu'il faut pour lire les informations du journal des transactions
Disclaimer: Je travaille comme ingénieur de support produit chez ApexSQL
- 1. Comment déterminer si une image a été modifiée?
- 2. Comment puis-je déterminer si une valeur dans une structure a été modifiée?
- 3. Comment déterminer si une entité a été enregistrée?
- 4. Pour savoir si une page * .aspx a été modifiée
- 5. Une classe en Java peut-elle déterminer si elle a été modifiée?
- 6. Comment savoir si la collection itérée a été modifiée?
- 7. Wicket: Prévenez si le modèle de page a été modifiée
- 8. jQuery; détecter si une boîte de sélection a été modifiée ou est sélectionnée
- 9. Comment déterminer si une URL asp.net a été "réécrite"?
- 10. Déterminer si une commande Powershell a été réussie
- 11. Déterminer si la base de données SQL Server a été restaurée
- 12. Comment puis-je déterminer quand une table InnoDB a été modifiée pour la dernière fois?
- 13. Comment déterminer si itérateur de sortie a été modifié
- 14. Déterminer si le contenu de dijit.dialog a été affiché
- 15. Comment savoir si une entité JPA détachée a déjà été conservée ou non?
- 16. Comment déterminer si une URL est une image ou non?
- 17. Comment une classe de base C++ peut-elle déterminer au moment de l'exécution si une méthode a été surchargée?
- 18. document.getElementById - vérifier si un élément a été trouvé ou non
- 19. Comment puis-je savoir quand une collection a été modifiée?
- 20. C# - Comment déterminer si une propriété est modifiée
- 21. Portable SQL pour déterminer si une table existe ou non?
- 22. Comment puis-je déterminer si un UILabel a été touché?
- 23. comment déterminer si une personne est en ligne ou non
- 24. JQuery: Comment déterminer si un bouton radio a été sélectionné?
- 25. Comment déterminer si un paramètre a été "posté" ou "récupéré" à partir de Java?
- 26. Comment déterminer quel contrôle a été touché?
- 27. Déterminer rapidement si un contenu de dossier a été modifié
- 28. Aide avec F #: "Collection a été modifiée"
- 29. Déterminer si ELMAH est activé ou non?
- 30. déterminer si dropdownlist est sélectionné ou non
Modifier comme n'importe quel changement? Vous pouvez vérifier le numéro de transaction. – TomTom
Oui comme dans tout changement. Une insertion/mise à jour/suppression dans n'importe quelle table, ou une table alter, un index modifié, etc. Type de timestamp/rowid mais pour toute la base de données. – Locksfree
Consultez la question http://stackoverflow.com/questions/2423909/is-there-meta-data-i-can-read-from-sql-server-to-know-the-last-changed-row-table/2424035 # 2424035 – Andrew