Mon patron a demandé hier à un client comment il pouvait savoir qui avait supprimé certaines données de sa base de données SQL Server (c'est l'édition express si cela compte).
Je pensais que cela pouvait être trouvé dans le journal des transactions (à condition qu'il n'ait pas été tronqué) - est-ce correct? Et si oui, comment allez-vous réellement trouver ces informations?
sql-server
transaction
delete
audit
Matt Wilko
la source
la source
fn_dblog
. Un inconvénient est qu'il renvoie la base de donnéesUSERNAME()
plutôt que le nom de connexion beaucoup plus utile.Si la base de données est en mode de récupération complète ou si vous disposez de sauvegardes de journaux de transactions, vous pouvez essayer de les lire à l'aide de lecteurs de journaux tiers.
Vous pouvez essayer ApexSQL Log (premium mais a un essai gratuit) ou SQL Log Rescue (gratuit mais sql 2000 uniquement).
la source
Bien que cela soit répondu, je voulais ajouter que SQL Server a une trace par défaut activée et qu'elle peut être utilisée pour savoir qui a déposé / modifié les objets.
Événements d'objets
Les événements d'objet incluent: Objet modifié, Objet créé et Objet supprimé
Remarque: SQL Server possède par défaut 5 fichiers de trace, 20 Mo chacun et il n'y a aucune méthode connue prise en charge pour changer cela. Si vous avez un système occupé, les fichiers de trace peuvent rouler beaucoup trop rapidement (même en quelques heures) et vous ne pourrez peut-être pas détecter certaines des modifications.
Un excellent exemple peut être trouvé: la trace par défaut dans SQL Server - la puissance de l'audit des performances et de la sécurité
la source
Vous pouvez essayer cette procédure pour interroger les fichiers de sauvegarde de journal et trouver dans quel (s) fichier (s) de sauvegarde de journal une valeur spécifique d'une colonne d'une table était encore / dernière présente.
Pour trouver l'utilisateur, après avoir trouvé dans quelle sauvegarde de journal la dernière valeur existait, vous pouvez restaurer une base de données jusqu'à cette sauvegarde de journal, puis suivre la réponse de Mark Storey-Smith .
Quelques prérequis
Avertissement
Cette solution est loin d'être étanche, et beaucoup de travail reste à faire.
Il n'a pas été testé sur des environnements à grande échelle, ni même sur des environnements autres que quelques petits tests. L'exécution actuelle était sur SQL Server 2017.
Vous pouvez utiliser la procédure ci-dessous de Muhammad Imran que j'ai modifiée pour travailler avec le contenu des sauvegardes de journal au lieu du contenu du journal d'une base de données en direct.
De cette façon, vous ne faites techniquement pas des restaurations, mais plutôt le vidage du contenu du journal dans une table temporaire. Il sera probablement encore lent et très ouvert aux bugs et problèmes. Mais cela pourrait fonctionner, en théorie ™.
La procédure stockée utilise la
fn_dump_dblog
fonction non documentée pour lire les fichiers journaux.Environnement de test
Considérez cette base de données, où nous insérons quelques lignes, effectuons 2 sauvegardes de journal et lors de la troisième sauvegarde de journal, nous supprimons toutes les lignes.
La procédure
Vous pouvez trouver et télécharger la procédure stockée ici .
Je ne pourrais pas l'ajouter ici car il est plus grand que la limite de caractères, et rendrait cette réponse encore moins claire qu'elle ne l'est.
En dehors de cela, vous devriez pouvoir exécuter la procédure.
Exécution de la procédure
Un exemple de cela, lorsque j'ajoute tous mes fichiers journaux (
4
) à la procédure stockée et exécute la procédure à la recherche de value1Cela me fait:
Où nous pouvons trouver la dernière fois qu'une opération a
value1
eu lieu, la supprimerlog3.trn
.Quelques données de test supplémentaires, ajout d'un tableau avec différentes colonnes
Modification des noms des fichiers journaux et réexécution de la procédure
Résultat
Une nouvelle exécution, recherchant l'entier (
2
) dans laval3
colonne dedbo.WrongDeletes2
Résultat
Appliquer la réponse de Mark Storey-Smith
Nous savons maintenant que cela s'est produit dans le troisième fichier journal, restaurons jusqu'à ce point:
Exécution de la dernière requête dans sa réponse
Résultat pour moi (sysadmin)
la source