2010-03-24 11 views
4

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?

+0

Modifier comme n'importe quel changement? Vous pouvez vérifier le numéro de transaction. – TomTom

+0

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

+0

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

Répondre

1

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.

+0

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

1

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).

2

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 
3

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

Questions connexes