2012-01-26 11 views
1

私の現在の仕事では、私のデータベースを更新するためにSQLスクリプトをしばらく実行しなければなりません。ほとんどの場合、正しく動作しなかった特定のレコードを更新する必要があります。ですが、これはページの機能性がありますが、それは少し長いルートですので、データベースに対して直接実行します。偶発的な更新からデータベースを保護する

私はちょうど更新クエリを実行し、私の30,000以上のすべてのレコードを誤って更新しました。幸い私はテストデータベースで作業していました。

//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

クエリを見ると、CustomersテーブルにCustomer_IdのIDがオンになっているプラ​​イマリキーがないと仮定します。これらのテーブルを両方とも設定すると、そのスクリプトの完了が確実に停止されます。

トランザクションでクエリをラップすることをお勧めします。ロールバックを呼び出す前に、最初に出力をテストするロールバックステートメントでスクリプトを実行します。結果が期待どおりの場合は、ロールバックをコミットに置き換えて、クエリを再実行します。

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

は、あなたは確かにテーブルの上に更新トリガを入れて挿入/ DELETED疑似テーブルは行の特定の数が多い場合に例外を投げることができる - これは、任意のトランザクションがロールバックしようとしている原因となります。

一般的に、プロダクションでは、テストされたprocsでこれらのスクリプトを持つなどいくつかのコントロールが必要ですが、明らかにすべてのコントロールには限界があります。そうしなければ、データ。

1

一般的に、本番データベースへのアクセスを更新するのはお勧めできません。必要なすべての更新は、ストアドプロシージャを使用して管理する必要があります。そうすれば、あなたは本当にあなたがやっていることについて考える必要があります。

また、@Neville Kが述べたように、取引は良いです。トランザクションが進行中でなければ何もしないようにストアドプロシージャを設定でき、procsで決してコミットしない場合は常にロールバックできます。あなたは、とにかく以上のゲームをコミットしたら、それは...、

を言ったこのラウンドなしハードかつ迅速な方法は、あなたができる最善のは、自分自身でそれを困難にしている、ありません(と他の人!)台無しにする...

2

私に対処させてください(2)。私は(1)のあなたの提案が助けになると思いますが、最初に計画を話しましょう。

スクリプトを直接使用するかどうかは、本当に間違っているかどうかは、リスクレベルによって決まります。このデータのミッションは重要ですか?トランザクションログを含め、適切なバックアップを取っていますので、間違いの前にすぐに回復できますか?バックアップを取るために必要な時間の間、データベースを停止することはできますか?

リスクを評価し、適切な処置を講じてください。エラーの可能性やエラーのコストが大きい場合は、リスクを軽減するのが一層難しくなります。これらの要素のいずれかが高い場合は、きちんとコード化されたインターフェイスを使用するようにしてください。中間レベル - 適切な変数を使用してスクリプトを作成して保存し、次回に誤ってWHERE句を削除したり、スクリプトを実行する前にバックアップを作成したりできないようにします。そして、間違いからの回復が安価で簡単な場合は、一度限りの質問を書いて、最高のものを願ってください。

0

はあなたのクエリは以下のように見えるべきです。例外処理が何らかの実行時エラーに以前の状態にdatatbaseをロールバックします。これにより

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

Begin Catch 
    Rollback Tran 
End Catch 

...

関連する問題