web-dev-qa-db-fra.com

Comment imprimer le texte de la requête SQL d'une transaction en interrogeant le journal "FN_DBLOG" ou DBCC ("Databasename")?

À un moment donné au cours des 24 dernières heures, certains changements ont été apportés à un client SQL Server 2008 (V 9,0 SP4) par l'un des deux applications possibles qui utilisent la DB.

Ce n'est pas une critique particulière, mais il représenterait une perspicacité utile sur la manière dont ces applications utilisent les tableaux si je pouvais jeter les déclarations SQL correspondant aux périodes de temps.

Les tables que je suis intéressé, ne changent pas très souvent et donc les journaux de transactions appliquées à ces tables particulières ne doivent pas être très importantes dans les lignes totales.

Je vois les commandes "FN_DBLOG" et DBCC Log ("DatabasEname") et semble avoir une information assez connexe, mais je ne sais pas comment passer la prochaine étape et les amener à produire un rapport des changements réels .

Il y a quelques détails dans ce blog post; http://janiceclee.com/tag/fn_dump_dblog/

USE AdventureWorks
    GO
    SELECT [Transaction ID], count(*)
    FROM fn_dblog(DEFAULT, DEFAULT)
    where AllocUnitName LIKE '%Production.TransactionHistory%'--table name
    GROUP BY [Transaction ID]
    HAVING COUNT(*) >= 113443 --(estimated/actual) number of deleted records

Cependant, je n'ai aucun détail comme celui-ci, juste le nom de la table (et les clés principales si nécessaire, je peux l'obtenir)

et un autre poste de blog qui utilise un exemple similaire de données étant donné leur dénomination de table; http://www.sqlskills.com/blogs/pull/post/search-Engine-qa-6-Utilisation-fn_dblog-a-tell-if-a-transaction-is-contenait-in-a- Backup.aspx

    USE AdventureWorks;

    GO

    SELECT [Current LSN], Operation, [Transaction ID], AllocUnitName FROM fn_dblog (NULL, NULL);

    GO

The log record at that LSN is:

    00000058:00001870:0001  LOP_MODIFY_ROW     0000:00001338  HumanResources.Employee.PK_Employee_EmployeeID

This is obviously in the middle of my contrived transaction - showing that it isn't all in the full backup. The end of the transaction isn't until way later in the log:

    0000005e:00000628:01b1  LOP_MODIFY_ROW     0000:00001338  HumanResources.Employee.PK_Employee_EmployeeID
    0000005e:00000628:01b2  LOP_COMMIT_XACT    0000:00001338  NULL
2
Tom H

Le journal des transactions ne contient pas de relevés, il contient les modifications physiques survenues dans la base de données. Si vous voyez un enregistrement de journal indiquant une suppression, vous ne pouvez pas savoir s'il s'agissait d'une instruction DELETE, d'une instruction Fusion ou d'une version de mise à jour large (scindée). Si vous voyez une opération indiquant un insert, vous ne pouvez pas savoir s'il s'agissait d'une valeur d'insertion (...) (...) ou était un insert (...) Sélectionnez (...) ou c'était un insert (. ..) EXEC ou c'était une fusion ou c'était une mise à jour large (scindée). Et ainsi de suite. Plus précisément, le journal des transactions n'a pas l'intention de substituer une trace d'audit.

L'agent de réplication de la transcription a des moyens de reconstruire l'opération T-SQL avec un effet identique comme ceux qui ont modifié un article publié, mais comment Ce n'est pas une information publique.

Si vous souhaitez surveiller les modifications de données, utilisez Modifier le suivi ou modifier la capture de données . Si vous souhaitez surveiller l'activité T-SQL, utilisez traces de profileur .

7
Remus Rusanu

Je ne pense pas que vous puissiez obtenir la requête du journal de transaction lui-même - je pourrais maintenant me tromper mais je ne l'ai jamais vu fait - bien que je n'ai jamais essayé non plus. Vous pouvez toutefois obtenir les données modifiées lors d'une transaction.

L'article ci-dessous présente une procédure stockée qui lira les données modifiées du journal des transactions; Je ne l'ai pas utilisé moi-même, mais quelques chaps dans notre entreprise disent que cela fonctionne assez bien. Veuillez noter que cela ne fonctionne que sur 2005 et ci-dessus:

http://raresql.com/2011/10/22/how-to-recover-Deleed-Data-from-sql-sever/

Cela pourrait fournir la perspicacité que vous êtes après - ou pas :-)

BTW Il existe quelques applications de lecteur de journal commercial qui font une chose similaire - mais quelque chose à garder à l'esprit est qu'ils ne vous fournissent que la capacité de faire quelque chose que vous pourriez vous faire suffisamment de recherches.

Si je puisse me permettre de suggérer un coup d'œil sur SQL Internals de Kalen Delaney, qui est un livre Excelent et vous aidera vraiment à comprendre beaucoup de ce qui se passe dans SQL Server:

http://www.microsoft.com/learning/en/us/book.aspx?id=12967&locale=EN-US

Maintenant, cela ne vous aidera pas pour les transactions passées, mais j'avance que je recommanderais probablement d'utiliser quelque chose comme Changer la capture de données ou le profileur SQL pour capturer les informations dont vous avez besoin - il est beaucoup plus facile que d'essayer de pêcher dans le journal des transactions. ;-)

J'espère que ceci vous aide.

3
Mr.Brownstone