SQL Server 2000 - 数据库表消失。可能的原因有哪些?

SQL Server 2000 - 数据库表消失。可能的原因有哪些?

我们的生产 SQL Server 2000 数据库中有一张表消失了。

它在 RAID 5 存储上运行,因此我们非常确信它不是与硬件相关的损坏。

我们知道这可能表明存在安全漏洞。我们正在调查。

还有其他可能的原因导致桌子看似随机地消失吗?

答案1

以下是最可能出现的情况(假设没有重复):

  • 故意 DROP TABLE
  • 无意的 DROP TABLE
  • SQL 注入攻击
  • 代码中的错误(存储过程、编译的 exe/dll 等)
  • 有人在 SSMS 的某个地方进行了胖点击
  • 有人编辑了图表并点击了“从数据库中删除表”而不是“从图表中删除”

您在数据库上使用哪种恢复模型?您可以滚动 trans 日志来查看发生了什么吗?

答案2

下列操作在 SQL Server 2000 上不起作用,但如果您转到 SQL Server 2005 或 2008,您可能需要执行以下操作:

CREATE TABLE [dbo].[AuditDDL](
    [EventID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
    [EventData] [xml] NULL,
    [EventTime] [datetime] DEFAULT (getdate())
    )
GO

-- This fails on SQL 2000. 
CREATE TRIGGER [trgAuditDDL]
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
INSERT INTO AuditDDL(EventData)
SELECT EVENTDATA()
GO

由于它还会捕获索引的重建时间,因此您需要每月左右运行以下命令来清除这些事件:

DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"ALTER_INDEX")]') =1
GO

DELETE FROM AuditDDL
WHERE [EventData].exist('/EVENT_INSTANCE/EventType/text()[fn:contains(.,"UPDATE_STATISTICS")]') =1
GO

我知道对于您的情况来说这有点晚了,而且 SQL Server 的版本也错误,但它可能会在将来对其他人有所帮助。

答案3

Redgate 的 SQL Log Rescue 可以免费下载,可能会有帮助。

我希望硬件问题能够在系统事件日志中体现出来(至少我的一直都是这样的)。

相关内容