it-swarm-eu.dev

Bestimmen, wie eine Schemaänderung aufgetreten ist?

Gestern ist etwas Schlimmes passiert.

Eine Ansicht, die vor einiger Zeit erstellt wurde, wurde von jemandem geändert, der schließlich die Berichte gebrochen hat. Unglücklicherweise. Jemand (wissentlich oder unwissentlich) hat diese Änderung in der PRODUCTION-Datenbank vorgenommen.

Meine Frage: Gibt es eine Möglichkeit (Skript/Software/Freeware usw.), mit der wir erfahren können, wer (Benutzername) diese Änderung vorgenommen hat, sodass ich diesem Benutzer den Zugriff auf die Produktionsdatenbank entziehen kann.

Wenn meine Frage unklar ist, kommentieren Sie bitte.

21
xorpower

Dies wird in der Standardablaufverfolgung protokolliert. Solange es aktiviert ist und in der Zwischenzeit nicht aktualisiert wurde, sollte es im Bericht "Verlauf der Schemaänderungen" angezeigt werden.

Um in Management Studio darauf zuzugreifen, klicken Sie mit der rechten Maustaste auf die Datenbank und wählen Sie im Kontextmenü Reports -> Standard Reports -> Schema Changes History

Um dieselben Informationen über TSQL abzurufen, können Sie verwenden

SELECT StartTime
       ,LoginName
       --,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )
36
Martin Smith

Martin wies bereits auf den besten Weg hin, den administrativen Audit-Trace, der normalerweise aktiviert ist (es sei denn, er wurde ausdrücklich deaktiviert). Wenn Sie die Informationen nicht in der Admin-Ablaufverfolgung finden können (wurde deaktiviert oder recycelt), können Sie Ruft die Informationen aus den Protokollsicherungen ab. Da es sich um eine Produktionsdatenbank handelt, gehe ich davon aus, dass Sie einen regelmäßigen Sicherungszyklus mit regelmäßigen vollständigen Sicherungs- und Protokollsicherungen haben. Sie müssen die Datenbank auf einem separaten Server ungefähr zum Zeitpunkt des Vorfalls wiederherstellen, damit sich die DDL im aktuell wiederhergestellten Protokoll befindet. Dann ist es einfach, fn_dblog() zu verwenden und das Protokoll zu überprüfen.

Eine Möglichkeit besteht darin, die Transaktion zu starten:

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

Wenn ALTER VIEW In einer eigenständigen Transaktion ausgegeben wurde (dh nicht von BEGIN TRANSACTION/COMMIT umgeben ist), wird eine Transaktion mit dem Namen CreatProc transaction Gestartet. Suchen Sie danach und [Transaction SID] Ist die gewünschte Login-SID.

Eine andere Möglichkeit besteht darin, in der gewünschten Ansicht nach der Transaktion zu suchen, die ein SCH_M erworben hat:

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 CREATE ausgeführt hat (die aktuelle Objekt-ID der Ansicht in der wiederhergestellten Datenbank). Mit der Transaktions-ID gehen Sie zurück und rufen die Informationen zur Starttransaktion ab:

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

Die [Transaktions-SID] ist wieder Ihr Typ. Verwenden Sie SUSER_SNAME , um den Anmeldenamen von der Anmelde-SID abzurufen. Wenn die SID 0x01 ist, bedeutet dies, dass die Anmeldung sa war, was bedeutet, dass jede Person, die das Kennwort sa kennt, dies hätte tun können.

19
Remus Rusanu

Nein, es sei denn, Sie haben es über einen DDL-Trigger oder dergleichen protokolliert

Sie möchten sehen, wer als ALTER-Rechte in dieser Datenbank oder als Mitglied der Rolle sysadmin/db_owner/ddl_admin fungiert. Dies wäre besser als allgemeine Überprüfung als als Hexenjagd. Es gibt wahrscheinlich auch andere Personen mit dem Recht, nicht genehmigte und nicht autorisierte Änderungen vorzunehmen

6
gbn

Wenn Sie dies noch nicht getan haben, sollten Sie den Schema Changes History Report überprüfen, der in SQL Server Management Studio verfügbar ist. Es sieht so aus, als ob SQL Server standardmäßig Änderungen protokolliert ( Standard-Trace ), und Sie sollten in der Lage sein, diese Daten über diesen Bericht anzuzeigen. Das einzig unglückliche ist, dass diese Tracedateien im Laufe der Zeit automatisch gelöscht/verschoben werden, sodass die Daten möglicherweise bereits verschwunden sind. Viel Glück!

0
Mark Madej