我们的生产 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 可以免费下载,可能会有帮助。
我希望硬件问题能够在系统事件日志中体现出来(至少我的一直都是这样的)。