Martin wies bereits auf die beste Möglichkeit hin, nämlich die Ablaufverfolgung für Verwaltungsprüfungen, die normalerweise aktiviert ist (sofern sie nicht ausdrücklich deaktiviert wurde). Wenn Sie die Informationen im Administrator-Trace nicht finden können (deaktiviert oder wiederverwendet), können Sie sie aus den Protokollsicherungen abrufen. Da es sich um eine Produktionsdatenbank handelt, wird davon ausgegangen, dass Sie einen regelmäßigen Sicherungszyklus mit regelmäßigen vollständigen Sicherungen und Protokollsicherungen haben. Sie müssen die Datenbank auf einem separaten Server ungefähr zum Zeitpunkt des Vorfalls wiederherstellen, damit sich die DDL im aktuellen wiederhergestellten Protokoll befindet. Dann ist es eine einfache Sache, fn_dblog()
das Protokoll zu verwenden und zu inspizieren.
Eine Möglichkeit besteht darin, mit der Transaktion den Betrieb aufzunehmen:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';
Wenn das ALTER VIEW
in einer eigenständigen Transaktion ausgegeben wurde (dh nicht von BEGIN TRANSACTION
/ umgeben ist COMMIT
), startet es eine Transaktion mit dem Namen CreatProc transaction
. Suchen Sie danach, und das [Transaction SID]
ist die gewünschte Anmelde-SID.
Eine andere Möglichkeit besteht darin, die Transaktion, die einen SCH_M erworben hat, in der gewünschten Sicht zu suchen:
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
Beachten Sie, dass, wenn die Ansicht durch DROP gefolgt von CREATE geändert wurde, die Objekt-ID wahrscheinlich geändert wurde, Sie jedoch zumindest die Transaktion erhalten, die zuletzt die CREATE-ID ausgeführt hat (die aktuelle Objekt-ID der Ansicht in der wiederhergestellten Datenbank). Mit der Transaktions-ID kehren Sie zurück und rufen die Informationen zum Beginn der Transaktion ab:
select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';
Die [Transaction SID] ist wieder Ihr Typ. Verwenden Sie SUSER_SNAME
diese Option , um den Anmeldenamen von der Anmelde-SID abzurufen. Wenn die SID 0x01 ist, bedeutet dies, dass die Anmeldung durchgeführt wurde. Dies bedeutet sa
, dass jede Person, die das sa
Kennwort kennt, dies hätte tun können.