2013-05-17 8 views
7

Ho database SQL Server SQL, vorrei sapere quali tabelle sono state aggiornate la scorsa settimana, ad esempio tabelle con nuove righe, righe esistenti aggiornate o quali righe sono state cancellate .Come elencare le tabelle in cui i dati sono stati inseriti cancellati o aggiornati nella settimana scorsa

C'è un modo per farlo per il database esistente.

+0

Track Data Modifiche (SQL Server) per il server SQL 2008 ... http: //msdn.microsoft.com/en-us/library/bb933994 % 28v = sql.100% 29.aspx – wcraft

+3

[Confronto tra acquisizione dati modifica e rilevamento modifiche] (http://msdn.microsoft.com/en-us/library/cc280519 (v = sql.100) .aspx). –

risposta

3

Provare con Change Data Capture. È un buon modo per tenere traccia delle modifiche sul DB. Devi abilitare la funzione su uno o più DB, quindi su una o più tabelle (è una funzione Tabella, quindi lo farai per ogni tabella che ti serve).


Abilita CDC sul database.

Supponiamo di voler abilitare CDC per il database AdventureWorks. Dobbiamo eseguire il seguente SP per essere sicuri che questa funzionalità funziona:

USE AdventureWorks 
GO 
EXEC sys.sp_cdc_enable_db 
GO 

Come risultato, troveremo un nuovo schema chiamato cdc e diversi tavoli aggiunti automaticamente:

  • cdc. captured_columns - Questa tabella restituisce il risultato per l'elenco della colonna acquisita.
  • cdc.change_tables - Questa tabella restituisce l'elenco di tutte le tabelle abilitate per l'acquisizione.
  • cdc.ddl_history - Questa tabella contiene la cronologia di tutte le modifiche DDL poiché i dati di acquisizione sono abilitati.
  • cdc.index_columns - Questa tabella contiene gli indici associati alla tabella dei cambiamenti.
  • cdc.lsn_time_mapping - Questa tabella mappa il numero e l'ora di LSN.

Abilita CDC sul tavolo.

Dopo aver attivato CDC su DB (s) desiderato è il momento di controllare se ci sono tavoli con questa funzione:

USE AdventureWorks 
GO 
SELECT [name], is_tracked_by_cdc 
FROM sys.tables 
GO 

In caso contrario, siamo in grado di abilitare i cambiamenti catturano per la tabella con HumanResources.Shift la seguente procedura:

USE AdventureWorks 
GO 
EXEC sys.sp_cdc_enable_table 
@source_schema = N'HumanResources', 
@source_name = N'Shift', 
@role_name  = NULL 
GO 

assicuratevi di SQL Agente è installato e funzionante perché crea un posto di lavoro (cdc.AdventureWorks_capture probabilmente) per catturare le modifiche. Se tutte le procedure sono eseguite correttamente troveremo una nuova tabella chiamata cdc.HumanResources_Shift_CT, tra le tabelle di sistema, contenente tutte le modifiche di HumanResources.Shift.

Nota: fare attenzione con il parametro @role_name, specifica l'accesso alle informazioni del database.

+0

+1 per l'argomento CDC. – Devart

2

Non è possibile trovare queste informazioni per impostazione predefinita a meno che non sia già installato un sistema di controllo.

L'unica opzione, supponendo che il database sia in modalità di ripristino completo, è di leggere il registro delle transazioni e provare a ottenere informazioni da lì.

È possibile provare a leggere il registro delle transazioni utilizzando le funzioni del server SQL DBCC LOG e fn_dblog o utilizzando strumenti di terze parti come ApexSQL Log.

0

Prova questo. Fornirà l'ultima data aggiornata per ogni tabella nel database.

USE database_name 

GO 


SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,* 
FROM sys.dm_db_index_usage_stats 

GO 

Per ulteriori riferimento clic here

1

Come commentato da altri, Change Data Capture e il rilevamento delle modifiche sarebbe la soluzione ideale se li avete implementato. Se non lo avete, quindi qui è un modo veloce, che vi darà informazioni in parte:

SELECT OBJECT_NAME(OBJECT_ID) AS Object, last_user_update 
FROM sys.dm_db_index_usage_stats 
WHERE database_id = DB_ID(<YourDBName>) 
AND OBJECT_ID=OBJECT_ID(<YourTableName>) 

Questo vi dirà quali sono le tabelle sono state aggiornate quando, ma non può realmente servire il tuo scopo, se si trovano di fronte a un scenario whodunnit. Inoltre, ti fornirà solo l'ultimo timestamp aggiornato, nel senso che se qualcuno ha aggiornato la scorsa settimana e qualcun altro aggiornato ieri, non vedrai i dettagli dell'ultimo aggiornamento della settimana.

Raj

7

provare questo -

SELECT 
     [db_name] = d.name 
    , [table_name] = SCHEMA_NAME(o.[schema_id]) + '.' + o.name 
    , s.last_user_update 
FROM sys.dm_db_index_usage_stats s 
JOIN sys.databases d ON s.database_id = d.database_id 
JOIN sys.objects o ON s.[object_id] = o.[object_id] 
WHERE o.[type] = 'U' 
    AND s.last_user_update IS NOT NULL 
    AND s.last_user_update BETWEEN DATEADD(wk, -1, GETDATE()) AND GETDATE() 
+0

+1 Questo va bene finché non è necessario l'utente, l'operazione e l'ultimo valore prima delle modifiche. –

Problemi correlati