2016-08-26 4 views
1

Es ist ein Problem mit einer der Tabellen aufgetreten. Die Tabelle wurde geändert und eine Spalte wurde aus der Tabelle entfernt. Es gibt zwei Möglichkeiten, dass dies in der Datenbank nach meinem Wissen passiert.Eine Spalte wurde aus einer Tabelle entfernt SQL 2008 R2

  1. Die Code-Änderungen von einem unserer Kollegen eingesetzt
  2. Irgend jemand die Tabelle manuell verändert hat.

Ich muß erkennen, ob es eine alte Aussage während einer bestimmten Zeit (vielleicht mit Benutzerinformationen) laufen war

+0

Es ist nicht Sie gehen jetzt zu helfen, aber ich habe die Vorschläge in [diesem Artikel von Aaron Bertrand] gefunden (https://www.mssqltips.com/sqlservertip/2085/sql-server-ddl-trigger-to-track-all-database-changes /) sehr nützlich, um solche Änderungen zu verfolgen. Obwohl es jetzt nicht hilfreich ist, könnte es Ihnen in der gleichen Situation in der Zukunft helfen. – GarethD

Antwort

4

Sie könnten in der Lage sein, aufzulesen, die die Schemaänderung aus der Standard-Spur gemacht:

--query all default trace rollover files for schema modifications 
SELECT 
    trace.DatabaseName 
    ,trace.ObjectName 
    ,te.name AS EventName 
    ,tsv.subclass_name 
    ,trace.EventClass 
    ,trace.EventSubClass 
    ,trace.StartTime 
    ,trace.EndTime 
    ,trace.NTDomainName 
    ,trace.NTUserName 
    ,trace.HostName 
    ,trace.ApplicationName 
    ,trace.Spid 
FROM (SELECT REVERSE(STUFF(REVERSE(path), 1, CHARINDEX(N'\', REVERSE(path)), '')) + N'\Log.trc' AS path 
    FROM sys.traces WHERE is_default = 1) AS default_trace_path 
CROSS APPLY fn_trace_gettable(default_trace_path.path, DEFAULT) AS trace 
JOIN sys.trace_events AS te ON 
    trace.EventClass=te.trace_event_id 
JOIN sys.trace_subclass_values AS tsv ON 
    tsv.trace_event_id = EventClass 
    AND tsv.subclass_value = trace.EventSubClass 
WHERE te.name = N'Object:Altered' 
    AND tsv.subclass_name = 'Commit' 
ORDER BY trace.StartTime; 
+0

Wie viele alte Daten sind mit Ihrer obigen Abfrage verfügbar? –

+0

@PareshJ, der Standard-Trace ist ein Rollover-Trace mit maximal 5 Dateien zu je 20 MB, also bis zu 100 MB Daten. Führen Sie die Abfrage 'SELECT * FROM sys.traces WHERE is_default = 1;' aus, um diese Eigenschaften anzuzeigen. –

+0

@DanGuzman: Danke für die Info über die maximale Größe, dauert die Spur auch nach dem Neustart des Servers – TheGameiswar

0

Sie können auch Datenbank-Transaktionsprotokoll abfragen. wenn Ihre Datenbank in vollständigem Wiederherstellungsmodell ist ..

ich eine Spalte der Tabelle gelöscht und unten sind meine Testergebnisse ..

create table t3 
(
id int, 
id1 int 
) 

alter table t3 
drop column id1 

Jetzt, als ich abfragen tlog i unten Informationen zu erhalten ..

select suser_sname([transaction sid]),operation,[transaction name],[begin time],[lock information],description 
from fn_dblog(null,null) where [lock information] like '%place object_id of table here%' 


username   operation  transaction name begin time    lock information        description 
somename   LOP_BEGIN_XACT ALTER TABLE  2016/08/26 18:52:52:763 NULL          ALTER TABLE;0x0105000000000005150000008c052d5705824bfa733f63aedf280000 
null    LOP_LOCK_XACT NULL     NULL     ACQUIRE_LOCK_SCH_M OBJECT: 6:1922105888:0  
0

Sie sehen können, wenn die letzte Änderung der Tabelle aufgetreten. Dies sollte Ihnen letzte Änderung geben (innerhalb von zwei Wochen)

SELECT 
    SO.Name 
    ,SS.name 
    ,SO.type_desc 
    ,SO.create_date 
    ,SO.modify_date 
FROM sys.objects AS SO 
INNER JOIN sys.schemas AS SS 
    ON SS.schema_id = SO.schema_id 
WHERE DATEDIFF(D,modify_date, GETDATE()) < 14 
AND TYPE IN ('P','U') 
Verwandte Themen