2012-01-26 110 views
1

在我目前的工作中,我不得不一次運行SQL腳本來更新我的數據庫。大多數情況下,他們是更新某些記錄,但無法正常工作。有頁功能做同樣的,但是這是一個更長的路線,所以我直接對數據庫。保護數據庫免遭意外更新

我只是跑一個更新查詢時,不慎更新了所有的我的3萬條記錄。幸運的是我在測試數據庫中工作。

//Particular query that I am talking about is this 
    update customers set 
    customer_id = 100 // where clause is missing and it will update all records 
  1. 我想知道,有沒有辦法防止這種批量更新數據庫的方式,可能是將一半如果更新影響超過500條記錄的觸發器?有什麼辦法來保護數據庫免受意外格式不正確的查詢。儘管我對更新特別感興趣。

  2. 我在做什麼真的當我直接對我的生產服務器使用SQL腳本時出錯。我是新手,需要專家意見。

+1

開始交易。 –

+2

總是測試運行你的腳本包裝它在事務http://msdn.microsoft.com/en-us/library/ms188929(v=sql.90).aspx –

+0

好的,幫助。但有人可以解釋這兩個部分。 –

回答

0

看你的查詢我認爲你的客戶表中沒有與Identity主鍵打開以CUSTOMER_ID,同時具有這些餐桌上設置肯定會停止該腳本無法完成。

我建議你在事務中包裝你的查詢。在調用Rollback之前,首先使用回滾語句測試輸出來運行腳本。如果結果符合您的預期,請使用提交替換回滾並重新運行查詢。

BEGIN TRAN 

UPDATE Customer SET Customer_ID = 100 

SELECT * FROM Customer 

ROLLBACK 
--If results look OK comment out ROLLBACK and comment in the line below 
--COMMIT 
2

你當然可以把一個更新觸發器在桌子上,並拋出一個異常,如果插入/刪除的假表有一定大量行 - 這將導致任何交易正在嘗試回滾。

一般來說,對於生產而言,您希望擁有一些控件,例如在測試過程中使用這些腳本,但顯然每個控件最終都會有一個限制 - 否則您將無法插入或更改任何控件數據。

1

它通常不是一個好主意,有一個生產數據庫更新訪問。所有必要的更新應該使用存儲過程進行管理。這樣一來,你真的要想想你在做之前在做什麼..

而且,@Nevilleķ提到,交易良好。您可以設置您的存儲過程,拒絕執行任何操作,除非事務正在進行中,並且如果您從未在您的proc中提交,則始終可以回滾。這就是說,一旦你提交時,它的遊戲反正..

有沒有一成不變的辦法解決這,你能做的最好是很難讓自己(和其他人!)搞砸了..

2

讓我說說(2)。我認爲你對(1)的建議可能會有所幫助,但我們先來談談計劃。

無論是使用腳本直接是「真的錯了」,取決於風險水平。這個數據任務至關重要嗎?你有一個很好的備份,包括交易日誌,所以你可以恢復到錯誤之前的一分鐘?數據庫可能會在一小時內停止運行,以便恢復數據庫?

評估風險,並採取適當的行動。如果出現錯誤的可能性或錯誤的成本很高,則要努力減輕風險。如果其中任何一個因素都很高,那就強迫自己使用緊密編碼的界面。中等級別 - 用合適的變量編寫腳本並保存它,以便下次不會意外刪除WHERE子句,或者確保在運行腳本之前拍攝備份。如果從錯誤中恢復既便宜又容易,請繼續寫下你的一次性查詢並希望最好。

0

您的查詢應該看起來像下面。

SET NOCOUNT ON 
SET XACT_ABORT ON 
Begin Try 
    Begin Tran 
     //SQL query 
    Commit Tran 
End Try 

Begin Catch 
    Rollback Tran 
End Catch 

這樣做的異常處理將回滾datatbase到以前的狀態,由於任何運行時錯誤...