私の顧客のために、私は時々彼ら自身のために作成した問題を修正するために、または私の製品のバグが作成した悪いデータを修正するために彼らのライブデータベースで作業をします。Unixのrootアクセスと同じように、それは危険です。事前にどのような教訓を学ぶ必要がありますか?
ライブデータの操作に注意するためにあなたがする一番のことは何ですか?
私の顧客のために、私は時々彼ら自身のために作成した問題を修正するために、または私の製品のバグが作成した悪いデータを修正するために彼らのライブデータベースで作業をします。Unixのrootアクセスと同じように、それは危険です。事前にどのような教訓を学ぶ必要がありますか?
ライブデータの操作に注意するためにあなたがする一番のことは何ですか?
回答:
私が何年にもわたって苦労して学んだ3つのこと...
まず、ライブデータの更新または削除を行う場合は、最初に、使用するWHERE句を使用してSELECTクエリを記述します。それが機能することを確認してください。それが正しいことを確認してください。次に、UPDATE / DELETEステートメントを既知の機能するWHERE句の前に追加します。
あなたは決して持ちたくない
DELETE FROM Customers
クエリアナライザに座ってWHERE句を書き込むのを待っています...誤って「実行」を押して、Customerテーブルを強制終了しました。おっと。
また、プラットフォームによっては、テーブルの「n」ダーティバックアップをすばやく作成する方法を確認してください。SQL Server 2005では、
SELECT *
INTO CustomerBackup200810032034
FROM Customer
Customerテーブル全体のすべての行をCustomerBackup200810032034という新しいテーブルにコピーします。更新が完了し、すべてが正常であることを確認したら、このテーブルを削除できます。最悪の事態が発生した場合、昨夜のバックアップをディスクまたはテープから復元するよりも、このテーブルから欠落しているデータを復元する方がはるかに簡単です。
最後に、カスケード削除で削除するつもりのないものが削除されることに注意してください。何かを変更する前に、テーブルの関係とキーの制約を確認してください。
BEGIN TRANSACTION;
そうすれば、間違いの後でロールバックできます。
コピーに変更を加え、満足したら、修正を適用してライブにします。
多くの場合、UPDATEまたはDELETEを実行する前に、同等のSELECTを記述します。
BEGIN TRAN t1にいる場合を除いて、更新を行わないでください。開発データベース、本番環境、どこにもありません。コメントの外でCOMMITTRANt1を実行しないでください-常に入力してください
--COMMIT TRAN t1
次に、ステートメントを選択して実行します。(明らかに、これはGUIクエリクライアントにのみ適用されます。)これらのことを行うと、それを行うことが第二の性質になり、いつでも失うことはほとんどありません。
私は実際にこれを入力する「更新」マクロを持っています。私はいつもこれを貼り付けて更新を設定します。削除と挿入についても同様のものを作成できます。
begin tran t1
update
set
where
rollback tran t1
--commit tran t1
UPDATEとDELETEに適切なWHERE句があることを常に確認してください。
私自身の質問に答えるには:
更新ステートメントを作成するときは、順序を変えて作成してください。
UPDATE [table-name]WHERE [conditions]SET [columns-and-values]変更する値を指定する前に更新する行を選択する方が、他の順序で実行するよりもはるかに安全です。update person set email = 'bob@bob.com'クエリウィンドウに座ったり、キーストロークを間違えて実行したり、テーブルのすべての行を台無しにしたりすることは不可能です。
編集:他の人が言っているように、書くWHERE前に削除の句を書いてくださいDELETE。
例として、私はこのようなSQLを作成します
--Update P Set
--Select ID, Name as OldName,
Name='Jones'
From Person P
Where ID = 1000
最後からそのSQLを選択して実行するまでのテキストを強調表示します。更新したいレコードをプルしていることを確認したら、Shiftキーを押しながらUpステートメントを強調表示して、それを実行します。
エイリアスを使用したことに注意してください。テーブル名を明示的に更新することはありません。私はいつもエイリアスを使います。
トランザクションとロールバック/コミットと組み合わせてこれを行うと、私は本当に、本当に安全です。
ライブデータベースに注意するための私の一番の方法は?触れないでください。:)
バックアップは、データベースに与えた損害を元に戻すことができますが、それでもその期間中に悪影響をもたらす可能性があります。
使用しているスクリプトがどれほど堅実だと思っていても、テストサイクルを実行してください。「テストサイクル」とは、データベースの独自のインスタンスに対してスクリプトを実行することを意味する場合でも、必ず実行してください。実稼働環境よりも、ローカルボックスに欠陥を導入する方がはるかに優れています。
さて、それは私が今考えることができるすべてについてです。大胆な一節をとると、私にとって何が一番かわかります。;-)
Oracleまたはそれをサポートする別のデータベースを使用している場合は、COMMITを実行する前に変更を確認してください。
スクリプトを使用してデータベースを更新する場合、誤って実行/実行を実行した場合に備えて、スクリプトの先頭にブレークポイントを1つまたは2つ配置するようにしてください。
読み取り専用ユーザーを作成し(またはDBAに実行させ)、そのユーザーのみを使用してDBを確認します。スキーマに適切な権限を追加して、ストアドプロシージャ/ビュー/トリガーなどのコンテンツを表示できるようにします。しかし、それらを変更する機能はありません。