Determinare come si è verificato un cambio di schema?


21

Ieri è successo qualcosa di brutto.

Una vista che è stata creata qualche tempo fa è stata modificata da qualcuno che alla fine ha rotto i rapporti. Sfortunatamente. qualcuno (consapevolmente o inconsapevolmente) ha fatto questa modifica nel database di PRODUCTION.

La mia domanda: esiste un modo (script / software / freeware ecc.) Con cui possiamo sapere chi (nome utente) ha apportato questa modifica, in modo da poter revocare l'accesso al database di produzione per quell'utente.

Se la mia domanda non è chiara, si prega di commentare.

Risposte:


36

Questo viene registrato sulla traccia predefinita, quindi, fintanto che è abilitato e non è stato eseguito il roll over nel frattempo, dovrebbe essere visualizzato nel rapporto "Cronologia modifiche schema".

Per accedervi in ​​Management Studio, fare clic con il pulsante destro del mouse sul database, quindi scegliere dal menu di scelta rapida Reports -> Standard Reports -> Schema Changes History

Per recuperare le stesse informazioni tramite TSQL è possibile utilizzare

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*/ )

Grazie Martin, ho eseguito la query sostituendo "FOO" con il mio punto di vista ma ciò non ha restituito nulla. Qualche idea sul perché ciò accada? Non ho eseguito sul server, però
xorpower il

1
@Xorpower - L'ho modificato per gestire anche l' Object:Createdevento nel caso in cui la vista fosse stata abbandonata e creata anziché modificata. Non sei sicuro di cosa intendi non eseguendo sul server? Ovviamente devi essere connesso all'istanza corretta, ma non importa da dove provenga la connessione fintanto che hai i permessi.
Martin Smith,

Grazie Martin, ma il risultato rimane lo stesso
xorpower il


3
@Xorpower - Beh, sembra che la traccia sia rotolata sopra e che tu abbia perso i dettagli di qualcosa di più vecchio di circa 11 ore. La traccia predefinita mantiene solo 5 file e quindi elimina quelli più vecchi. Potresti voler controllare sul file system sul server la cartella solo per verificare che questo sia sicuramente il caso. È possibile ottenere il percorso della cartella daSELECT path FROM sys.traces where is_default=1
Martin Smith

19

Martin ha già indicato la strada migliore, la traccia di controllo amministrativo che di solito è attiva (a meno che non sia stata esplicitamente disabilitata). Se non è possibile trovare le informazioni nella traccia di amministrazione (è stata disabilitata o è stata riciclata) è possibile recuperare le informazioni dai backup del registro. Poiché è un DB di produzione, suppongo che tu abbia un ciclo di backup regolare, con backup periodici completi e backup dei log. Sarà necessario ripristinare, su un server separato, il database al momento dell'incidente in modo che il DDL si trovi nel registro ripristinato corrente. Quindi è una semplice questione di utilizzo fn_dblog()e controllo del registro.

Un modo è seguire le operazioni di inizio transazione:

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

Se è ALTER VIEWstato emesso in una transazione autonoma (cioè non circondata da BEGIN TRANSACTION/ COMMIT), avvierà una transazione denominata CreatProc transaction. Cercalo e [Transaction SID]è il SID di accesso che desideri.

Un'altra possibilità è cercare la transazione che ha acquisito un SCH_M nella vista desiderata:

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

Si noti che se la vista è stata modificata da DROP seguita da CREATE, probabilmente è stato modificato l'id oggetto, ma almeno si otterrà la transazione che ha eseguito l'ultima volta CREATE (l'attuale ID oggetto della vista nel db ripristinato). Con l'ID transazione si torna indietro e si recuperano le informazioni di inizio transazione:

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

Il [Transaction SID] è, ancora una volta, il tuo ragazzo. Utilizzare SUSER_SNAMEper recuperare il nome di accesso dal SID di accesso. Se il SID è 0x01 significa che il login lo era sa, il che significa che chiunque sapesse che la sapassword avrebbe potuto farlo.


2
Un bel consiglio per leggere i file di registro. Questo è utile se qualcuno disabilita le tracce predefinite.
StanleyJohns,

Cosa succede se il SID della transazione è null?
evictednoise

@evictednoise si prega di pubblicare i record di registro pertinenti (in una domanda separata). Può essere più di una ragione e i record di registro aiuterebbero a determinare la causa effettiva.
Remus Rusanu,

6

No, a meno che non sia stato registrato tramite un trigger DDL o simile

Volete vedere chi come diritti ALTER in quel database o appartenenza al ruolo sysadmin / db_owner / ddl_admin. Sarebbe meglio come una recensione generale piuttosto che una caccia alle streghe. Probabilmente ci sono altre persone con il diritto di apportare modifiche non approvate e non autorizzate


0

Se non lo hai già fatto, potresti voler consultare il rapporto Cronologia modifiche schema disponibile in SQL Server Management Studio. Sembra che SQL Server registri le modifiche per impostazione predefinita ( traccia predefinita ) e dovresti essere in grado di visualizzare quei dati tramite questo rapporto. L'unica cosa spiacevole è che questi file di traccia vengono automaticamente cancellati / rollover col passare del tempo, quindi i dati potrebbero già essere andati. In bocca al lupo!


Whoops, non importa. Vedo che Martin Smith ha già fatto riferimento a questo rapporto nella sua risposta. Lascio questo qui, comunque, nel caso in cui uno dei link sia utile.
Mark Madej,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.