Martin a déjà indiqué la meilleure avenue, la trace d'audit administratif qui est généralement activée (sauf si elle a été explicitement désactivée). Si vous ne trouvez pas les informations dans la trace d'administration (a été désactivée ou recyclée), vous pouvez récupérer les informations à partir des sauvegardes du journal. Puisqu'il s'agit d'une base de données de production, je suppose que vous avez un cycle de sauvegarde régulier, avec des sauvegardes complètes périodiques et des sauvegardes de journaux. Vous devrez restaurer, sur un serveur distinct, la base de données à peu près au moment de l'incident afin que la DDL se trouve dans le journal restauré actuel. Il suffit ensuite d'utiliser fn_dblog()
et d'inspecter le journal.
Une façon consiste à passer par les opérations de début de transaction:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';
Si le a ALTER VIEW
été émis dans une transaction autonome (c'est-à-dire non entouré de BEGIN TRANSACTION
/ COMMIT
), il démarrera une transaction nommée CreatProc transaction
. Recherchez-le et [Transaction SID]
c'est le SID de connexion que vous souhaitez.
Une autre possibilité consiste à rechercher la transaction qui a acquis un SCH_M sur la vue que vous souhaitez:
select [Lock Information], *
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go
Notez que si la vue a été modifiée par DROP suivi de CREATE, l'ID d'objet a probablement été modifié, mais au moins vous obtiendrez la transaction qui a fait la dernière CREATE (l'ID d'objet actuel de la vue dans la base de données restaurée). Avec l'ID de transaction, vous revenez en arrière et récupérez les informations de début de transaction:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';
Le [Transaction SID] est, encore une fois, votre gars. Utilisez SUSER_SNAME
pour récupérer le nom de connexion à partir du SID de connexion. Si le SID est 0x01, cela signifie que la connexion était sa
, ce qui signifie que toute personne connaissant le sa
mot de passe aurait pu le faire.