前两天有客户(刚上的系统)说交接班时把系统退出重新登录后6:00到8:00这段时间操作的数据不见了,这种情况出现几次了,
相同客户,有一次去更新一个报表的存储过程并执行了,结果系统重新登录后也出现前面刚操作的数据不见了。
一直没找不原因,请高手们帮忙分析分析。
    有人说物事处理会造成回滚,那回滚的应该是本次操作的数据,难道会回滚某段时间的数据吗?
    相同的系统不同的客户,有的客户会出现这种情况,有的客户又不会。

解决方案 »

  1.   

    日志直接查看不了具体执行的SQL语句,有什么方法??
      

  2.   

    你用log explore这个软件看看日志。
      

  3.   

    这类型问题非常难搞,2008的话我建议你先建立CDC监控,可以看我的文章:http://blog.csdn.net/dba_huangzj/article/details/8130448,可以记录数据的变更。
    然后进行权限控制,尽可能保证只有DBA和程序可以访问并操作数据库。
    可以考虑使用DDL触发器:/****** Object:  DdlTrigger [DDLTriggertTrace]    Script Date: 03/18/2013 16:46:29 ******/
    SET ANSI_NULLS ON
    GOSET QUOTED_IDENTIFIER ON
    GOCREATE TRIGGER [DDLTriggertTrace] ON DATABASE
    --捕获存储过程、视图、表的创建、修改、删除动作
        FOR CREATE_PROCEDURE, ALTER_PROCEDURE, DROP_PROCEDURE, CREATE_VIEW,
            ALTER_VIEW, DROP_VIEW, CREATE_TABLE, ALTER_TABLE, DROP_TABLE
    AS
        BEGIN
            SET NOCOUNT ON ;
            DECLARE @EventData XML = EVENTDATA() ;--返回有关服务器或数据库事件的信息,以XML格式保存。
            DECLARE @ip VARCHAR(32) = ( SELECT  client_net_address
                                        FROM    sys.dm_exec_connections
                                        WHERE   session_id = @@SPID
                                      ) ;        INSERT  AuditDB.dbo.DDLEvents
                    ( EventType ,
                      EventDDL ,
                      EventXML ,
                      DatabaseName ,
                      SchemaName ,
                      ObjectName ,
                      HostName ,
                      IPAddress ,
                      ProgramName ,
                      LoginName
                    )
                    SELECT  @EventData.value('(/EVENT_INSTANCE/EventType)[1]',
                                             'NVARCHAR(100)') ,
                            @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]',
                                             'NVARCHAR(MAX)') ,
                            @EventData ,
                            DB_NAME() ,
                            @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',
                                             'NVARCHAR(255)') ,
                            @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',
                                             'NVARCHAR(255)') ,
                            HOST_NAME() ,
                            @ip ,
                            PROGRAM_NAME() ,
                            SUSER_SNAME() ;
        ENDGOSET ANSI_NULLS OFF
    GOSET QUOTED_IDENTIFIER OFF
    GO并把触发器的数据存在另外一个库的表中:/****** Object:  Table [dbo].[DDLEvents]    Script Date: 03/18/2013 16:47:07 ******/
    SET ANSI_NULLS ON
    GOSET QUOTED_IDENTIFIER ON
    GOSET ANSI_PADDING ON
    GOCREATE TABLE [dbo].[DDLEvents](
    [EventDate] [datetime] NOT NULL,
    [EventType] [nvarchar](64) NULL,
    [EventDDL] [nvarchar](max) NULL,
    [EventXML] [xml] NULL,
    [DatabaseName] [nvarchar](255) NULL,
    [SchemaName] [nvarchar](255) NULL,
    [ObjectName] [nvarchar](255) NULL,
    [HostName] [varchar](64) NULL,
    [IPAddress] [varchar](32) NULL,
    [ProgramName] [nvarchar](255) NULL,
    [LoginName] [nvarchar](255) NULL
    ) ON [PRIMARY]GOSET ANSI_PADDING OFF
    GOALTER TABLE [dbo].[DDLEvents] ADD  DEFAULT (getdate()) FOR [EventDate]
    GO这些步骤可以监控到ddl和dml的发生过程,当你接到问题再次发生的时候,去查这些表,