前两天有客户(刚上的系统)说交接班时把系统退出重新登录后6:00到8:00这段时间操作的数据不见了,这种情况出现几次了,
相同客户,有一次去更新一个报表的存储过程并执行了,结果系统重新登录后也出现前面刚操作的数据不见了。
一直没找不原因,请高手们帮忙分析分析。
有人说物事处理会造成回滚,那回滚的应该是本次操作的数据,难道会回滚某段时间的数据吗?
相同的系统不同的客户,有的客户会出现这种情况,有的客户又不会。
相同客户,有一次去更新一个报表的存储过程并执行了,结果系统重新登录后也出现前面刚操作的数据不见了。
一直没找不原因,请高手们帮忙分析分析。
有人说物事处理会造成回滚,那回滚的应该是本次操作的数据,难道会回滚某段时间的数据吗?
相同的系统不同的客户,有的客户会出现这种情况,有的客户又不会。
然后进行权限控制,尽可能保证只有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的发生过程,当你接到问题再次发生的时候,去查这些表,