代码之家  ›  专栏  ›  技术社区  ›  Thomas

关于sql server事务日志

  •  1
  • Thomas  · 技术社区  · 15 年前

    如果有人从我的数据库中删除任何对象,如表、视图、sp等,那么如何从事务日志中获取这些细节,如谁删除以及何时删除。有可能吗。请告诉我阅读事务日志的简单方法,这样我就可以正确地获得这些细节。

    谢谢

    4 回复  |  直到 15 年前
        1
  •  2
  •   ceth    15 年前

    不,创建传输日志的目的不同。有一些不同的产品供应商试图从事务日志中获取信息,但这不是正确的方法。

    谁删除,何时删除

    如果需要此信息,则需要创建表触发器以进行删除或更新并收集此信息。

    如果使用MS SQL 2008,则可以使用 Change Data Capture 特色。

        2
  •  2
  •   John Sansom    15 年前

    显然你可以使用第三方产品,比如 Apex SQL Log ,虽然我个人没有用过。

    根据事件发生的时间,您还可以从SQL Server 2005中的内置报表(如“架构更改历史记录”报表)中提取所需的信息。您可以通过默认跟踪访问此信息。见 using the Default Trace 详细情况。

    您真正需要从事件中吸取的是,使用本课程为您的环境设计模式审核策略。互联网上有很多文章详细介绍了如何使用触发器实现这一点。例如,请参见 Using DDL Triggers in SQL Server 2005 to Capture Schema Changes

        3
  •  1
  •   nvogel    15 年前

    您可以还原数据库(不覆盖它!)从完整备份/事务日志备份,然后从中复制删除的对象。将存储过程、视图和表的源代码保存到数据库之外(通常在源代码管理系统中)是一种很好的做法,因此不必还原数据库备份即可获取它们。

        4
  •  1
  •   Ivan Stankovic    11 年前

    您可以使用DDL触发器或SQL Server审计功能

    DDL在与数据库对象安全设置(如GRANT、DENY)相关的创建、更改、删除和操作时触发fire

    在下面的示例中,DDL触发器跟踪对数据库表、存储过程、函数和视图执行的创建、更改和删除操作。触发器示例使用先前创建的具有适当行的存储库表(DDL-Events-by-DDL-trigger)

    CREATE TRIGGER DDL_TRIGGER ON DATABASE
    FOR CREATE_TABLE ,
       ALTER_TABLE ,
       DROP_TABLE ,
       CREATE_PROCEDURE ,
       ALTER_PROCEDURE ,
       DROP_PROCEDURE ,
       CREATE_FUNCTION ,
       ALTER_FUNCTION ,
       DROP_FUNCTION ,
       CREATE_VIEW ,
       ALTER_VIEW ,
       DROP_VIEW
    AS
    DECLARE
        @event xml;
     SET
     @event = EVENTDATA();
     INSERT INTO DDL_Events_by_DDL_TRIGGER
     VALUES
     (
     REPLACE(CONVERT(varchar(58),
     @event.query('data(/EVENT_INSTANCE/PostTime)')), 'T', ' ')
     ,
     CONVERT(varchar(185),
     @event.query('data(/EVENT_INSTANCE/LoginName)'))
     ,
     CONVERT(varchar(185),
     @event.query('data(/EVENT_INSTANCE/DatabaseName)'))
     ,
     CONVERT(varchar(185),
     @event.query('data(/EVENT_INSTANCE/SchemaName)'))
     ,
     CONVERT(varchar(185),
     @event.query('data(/EVENT_INSTANCE/ObjectName)'))
     ,
     CONVERT(varchar(185),
     @event.query('data(/EVENT_INSTANCE/ObjectType)'))
     ,
     CONVERT(varchar(max),
     @event.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)'))
     );
    

    repository表将包含(在触发器中指定的)对数据库模式的DDL操作,以及有关更改的对象、时间和内容的信息

    另一个本机方法可用于确定SQL Server数据库是否已被更改,它是 SQL Server Audit feature . 此功能在SQL Server 2008中引入,它收集由SQL Server扩展事件功能引发的服务器级和数据库级操作。但是,数据库级操作组仅在SQL Server企业版和开发人员版中可用