2014-10-03 37 views
0

有三個不同的應用程序使用的SQL Server 2012數據庫。在那個數據庫中有一個包含〜500k行的表,並且出於一些神祕的原因,這個表每次都會被清空。我認爲這是可能的原因如下:確定刪除表中所有行的操作

  • 刪除查詢沒有where子句
  • 在一個循環中刪除查詢狂野

我試圖通過審查找到此問題的原因代碼但沒有喜悅。我需要一個替代策略。我認爲我可以使用觸發器來檢測/爲什麼所有行被刪除,但我不知道如何去做這件事。所以:

  • 我可以使用觸發器來檢查查詢是否試圖刪除所有行嗎?
  • 我可以使用觸發器記錄有問題的查詢和發出該查詢的應用程序
  • 我可以使用觸發器將這些操作記錄到文本文件/數據庫表/電子郵件中嗎?
  • 有沒有更好的方法?
+0

您可以創建一個觸發登錄/警告如果要刪除的行的總數超過一定數量。這將趕上失蹤的條款。是否也有可能在某處有'TRUNCATE TABLE xxx'語句或某人惡意地影響您的數據庫? – DavidG 2014-10-03 08:37:49

+0

@DavidG是的,這樣的觸發器可以幫助我找出原因(惡意或其他)。但是我怎麼能創造這樣一個觸發器? – 2014-10-03 09:31:57

+0

使用'SQL Server profiler'來記錄包含表名的所有查詢。 – adrianm 2014-10-03 09:36:53

回答

2

你可以使用擴展事件來監控您的系統。 這裏有一個簡單的屏幕截圖。

Extended Events

一個簡單的政策可以監視刪除截斷語句。 當這個事件被提出的細節被寫入文件。

此處爲刪除語句收集的詳細信息(您可以配置腳本以收集更多數據)的屏幕。

List Events

這裏使用的腳本,修改輸出文件的路徑

CREATE EVENT SESSION [CheckDelete] ON SERVER 
ADD EVENT sqlserver.sql_statement_completed(SET collect_statement=(1) 
    ACTION(sqlserver.client_connection_id,sqlserver.client_hostname) 
    WHERE ([sqlserver].[like_i_sql_unicode_string]([statement],N'%delete%') OR [sqlserver].[like_i_sql_unicode_string]([statement],N'%truncate%'))) 
ADD TARGET package0.event_file(SET filename=N'C:\temp\CheckDelete.xel',max_file_size=(50)) 
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) 
GO 
0

這是一個可能幫助你的可能性。它在Table1上創建觸發器,當進程DELETE有超過100條記錄時,它會發送電子郵件。我修改消息,以包括像一些有用數據:

  1. 進程ID(@@SPID
  2. 主機(HOST_NAME()
  3. 應用名稱(APP_NAME()
  4. 和可能整個查詢

CREATE TRIGGER Table1MassDeleteTrigger 
ON dbo.Activities 
FOR DELETE 
AS 
    DECLARE @DeleteCount INT = (SELECT COUNT(*) FROM deleted) 

    IF(@DeleteCount > 100) 
     EXEC msdb.dbo.sp_send_dbmail 
     @profile_name = 'MailProfileName', 
     @recipients = '[email protected]', 
     @body = 'Something is deleting all your data!', 
     @subject = 'Oops!'; 
相關問題