已从表SQL 2008 R2中删除列

时间:2016-08-26 12:04:03

标签: sql-server sql-server-2008-r2

其中一个表存在问题。该表已被更改,并且已从表中删除了一列。 根据我的知识,数据库中有2次机会发生这种情况。

  1. 我们的同事
  2. 部署的代码更改
  3. 有人手动改变了桌子。
  4. 我需要确定在特定时间内是否有运行的alter语句(可能包含用户信息)

3 个答案:

答案 0 :(得分:4)

您可能能够收集从默认跟踪中更改架构的人员:

--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;

答案 1 :(得分:0)

如果您的数据库处于完全恢复模式,您也可以查询数据库事务日志。

我删除了一个表格列,下面是我的测试结果..

create table t3
(
id int,
id1 int
)

alter table t3
drop column id1

现在,当我查询tlog时,我得到以下信息..

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    

答案 2 :(得分:0)

您可以看到表的最后一次修改发生的时间。这应该给你最后的改变(两周内)

    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')