ライブデータベースに注意するための一番の方法は何ですか?[閉まっている]


80

私の顧客のために、私は時々彼ら自身のために作成した問題を修正するために、または私の製品のバグが作成した悪いデータを修正するために彼らのライブデータベースで作業をします。Unixのrootアクセスと同じように、それは危険です。事前にどのような教訓を学ぶ必要がありますか?

ライブデータの操作に注意するためにあなたがする一番のことは何ですか?

回答:


101

私が何年にもわたって苦労して学んだ3つのこと...

まず、ライブデータの更新または削除を行う場合は、最初に、使用するWHERE句を使用してSELECTクエリを記述します。それが機能することを確認してください。それが正しいことを確認してください。次に、UPDATE / DELETEステートメントを既知の機能するWHERE句の前に追加します。

あなたは決して持ちたくない

DELETE FROM Customers

クエリアナライザに座ってWHERE句を書き込むのを待っています...誤って「実行」を押して、Customerテーブルを強制終了しました。おっと。

また、プラットフォームによっては、テーブルの「n」ダーティバックアップをすばやく作成する方法を確認してください。SQL Server 2005では、

SELECT *
INTO CustomerBackup200810032034
FROM Customer

Customerテーブル全体のすべての行をCustomerBackup200810032034という新しいテーブルにコピーします。更新が完了し、すべてが正常であることを確認したら、このテーブルを削除できます。最悪の事態が発生した場合、昨夜のバックアップをディスクまたはテープから復元するよりも、このテーブルから欠落しているデータを復元する方がはるかに簡単です。

最後に、カスケード削除で削除するつもりのないものが削除されることに注意してください。何かを変更する前に、テーブルの関係とキーの制約を確認してください。


1
単に技術的な顧客から削除するという意味ではありません:
craigmoliver 2008年

5
または、カスケードを使用しない方がよいでしょう。
dkretz 2009

108
BEGIN TRANSACTION;

そうすれば、間違いの後でロールバックできます。


うん、顔の手のひらの狂気を防ぐためのほとんど唯一の方法。
willasaywhat 2008年

11
@Graeme、本番データベースでDDLを実行するべきではありません。スクリプトを作成してテストデータベースで実行し、テストデータベースがQAに合格したら、本番サーバーで実行する必要があります。
ポールトゥームリン

1
@ポール:絶対に。しかし、DDLであろうとDMLであろうと、本番データベースにあらゆる種類の変更を加えて同じことを行う必要があると主張することができます。その場合、この質問全体は無意味です。
Graeme Perrow

3
エドゥアルド、これまでのところ45票を獲得しました。これは、ほとんどの場合、指がキーボード上で完全に下に移動し終わる前に冷たい発汗が始まるためですが、指を止めるには遅すぎます。
ユーロミセリ2008年

1
また、同じトランザクション内で一連の選択を実行して、コミットする前に結果を確認できるという点でも役立ちます。予期しない場合でも、害はありません。ロールバックするだけです。
Dave Cluderay 2009年

50

最初にバックアップを実行します。とにかくsysadminingの一番の法則である必要があります

編集:他の人が言ったことを取り入れて、あなたのUPDATESに適切なWHERE句があることを確認してください。

理想的には、ライブデータベースの変更は決して起こらないはずです(INSERTと基本的なメンテナンスを超えて)。ライブDBの構造を変更すると、特に潜在的な悪いカルマが発生します。


25

コピーに変更を加え、満足したら、修正を適用してライブにします。


ほとんどの場合、コピーデータベースはライブとは異なり、すべての変更がコピーとライブと同じように動作するわけではありません。
bugBurger 2008年

コピーデータベースがライブデータベースと異なる場合、それは実際にはコピーデータベースではないということではないでしょうか。test / qa / copyデータベースの全体的な目的は、変更をライブ/本番データベースに適用する前にテストすることです。
Wilco

22

多くの場合、UPDATEまたはDELETEを実行する前に、同等のSELECTを記述します。


すばやく簡単なチェックとして、私もこの方法が好きです。結果の数によっては機能しない場合がありますが、少なくともUPDATESとDELETESの開始点です。
osp70 2008年

18

BEGIN TRAN t1にいる場合を除いて、更新を行わないでください。開発データベース、本番環境、どこにもありません。コメントの外でCOMMITTRANt1を実行しないでください-常に入力してください

--COMMIT TRAN t1

次に、ステートメントを選択して実行します。(明らかに、これはGUIクエリクライアントにのみ適用されます。)これらのことを行うと、それを行うことが第二の性質になり、いつでも失うことはほとんどありません。

私は実際にこれを入力する「更新」マクロを持っています。私はいつもこれを貼り付けて更新を設定します。削除と挿入についても同様のものを作成できます。

begin tran t1
update 
set 
where 
rollback tran t1
--commit tran t1

ええ、これはまさに私がしていることです。「where句を忘れないでください」と言う人が多すぎますが、間違っているとどうなりますか?このbegin / rollback / -commitパターンなしで、ライブデータベースを更新しないでください。
エリックZビアード

追加の改善点は、最初にwhere句で「select * from」を実行して正しいことを確認してから、同じwhere句で更新を実行することです。
エリックZビアード

エリックは正しいですが、スコープクリープを避けるためにこれをマクロから除外します。一般的な使用のために「select * from」と入力する別のマクロがあります。
Patrick Szalapski 2008

このようにしない理由はありません。前のジョブで更新スクリプトを作成する必要があったときは、更新のSELECTとのSELECTを使用してこのように作成したので、結果を確認できました。数回実行し、結果が正しいことを確認した後、ROLLBACKをCOMMITに変更しました。
ライアンランディ

13

UPDATEとDELETEに適切なWHERE句があることを常に確認してください。


はい、私は以前にこれに火傷を負ったことがあります。
イアンジェイコブス

私も。それ以来、where句が最初に来るようにSQLが設計されていることを望みました。
Greg Hewgill

クイックUPDATEを実行すると、その沈み込み感が大好きで、「1279209394レコードが影響を受けました」と表示されます。ええとああ。;)
ケビンフェアチャイルド

13

私自身の質問に答えるには:

更新ステートメントを作成するときは、順序を変えて作成してください。

  1. 書く UPDATE [table-name]
  2. 書く WHERE [conditions]
  3. 戻って書く SET [columns-and-values]

変更する値を指定する前に更新する行を選択する方が、他の順序で実行するよりもはるかに安全です。update person set email = 'bob@bob.com'クエリウィンドウに座ったり、キーストロークを間違えて実行したり、テーブルのすべての行を台無しにしたりすることは不可能です。

編集:他の人が言っているように、書くWHERE前に削除の句を書いてくださいDELETE


11

例として、私はこのようなSQLを作成します

--Update P Set
--Select ID, Name as OldName, 
    Name='Jones'
From Person P
Where ID = 1000

最後からそのSQLを選択して実行するまでのテキストを強調表示します。更新したいレコードをプルしていることを確認したら、Shiftキーを押しながらUpステートメントを強調表示して、それを実行します。

エイリアスを使用したことに注意してください。テーブル名を明示的に更新することはありません。私はいつもエイリアスを使います。

トランザクションとロールバック/コミットと組み合わせてこれを行うと、私は本当に、本当に安全です。


選択チェックも使用します-この方法でいくつかのwhere句エラーを見つけました。特にステートメントが複雑な場合は、適切なサニティチェックになります。
Bob Probst

この方法は、上司が日中に本番環境で重要なテーブルを削除するのを見た後、短期間で磨かれました。
wcm 2008年

選択を切り替えて更新し、選択のコメントを削除します。次に、準備ができたら、その領域を強調表示して実行します。削除にも使用できます。
rball 2009年

11

ライブデータベースに注意するための私の一番の方法は?触れないでください。:)

バックアップは、データベースに与えた損害を元に戻すことができますが、それでもその期間中に悪影響をもたらす可能性があります。

使用しているスクリプトがどれほど堅実だと思っていても、テストサイクルを実行してください。「テストサイクル」とは、データベースの独自のインスタンスに対してスクリプトを実行することを意味する場合でも、必ず実行してください。実稼働環境よりも、ローカルボックスに欠陥を導入する方がはるかに優れています。


6
  1. 更新を行っているステートメントを確認、再確認、および再確認します。単純な単一列の更新を行っているだけだと思っていても、遅かれ早かれ、十分なコーヒーがなく、「where」句を忘れて、テーブル全体が混乱します。

私が役立つと思った他のいくつかのこと:

  • MySQLを使用している場合は、安全な更新を有効にします

  • DBAをお持ちの場合は、DBAに依頼してください。

これらの3つのことが、深刻な危害を加えることを妨げていることがわかりました。


ええ、クラシック:UPDATE TABLE_NAME SET FIELD_X = 'whatever' [WHERE = Missing]
Stefan Steiger

6
  • 誰もバックアップを望んでいませんが、誰もが回復を求めています
  • 次の理由から、外部キー参照を使用してDBを作成します。
  • 自分でデータを更新/削除し、構造的完全性を破壊することをできるだけ難しくします
  • 可能であれば、変更を永続的に保存する前に変更をコミットする必要があるシステムで実行します(つまり、データベースの修復中に自動コミットを非アクティブ化します)
  • 問題のクラスを特定して、問題なく修正する方法を理解できるようにしてください
  • データベースへのバックアップを再生するルーチンを取得し、常にテストサーバー上に2つ目のデータベースを用意して、それに取り組むことができるようにします。
  • 覚えておいてください:何かが完全に失敗した場合は、できるだけ早く再起動して実行する必要があります

さて、それは私が今考えることができるすべてについてです。大胆な一節をとると、私にとって何が一番かわかります。;-)


自動コミットは重要な安全メカニズムであるため、オートコミットについても触れておきたいと思います。データベースに直接接続している場合は、通常、db接続パラメーターで自動コミットをオフにできます。それ以外の場合(dbフロントエンド製品)、アプリケーション設定を探す必要がある場合があります。
マイクモネット

3

おそらく、削除や削除をまったく使用しないことを検討してください。または、特別なDBユーザーだけが削除/削除できるように、ユーザー権限を減らします。


3

Oracleまたはそれをサポートする別のデータベースを使用している場合は、COMMITを実行する前に変更を確認してください。


トランザクションの保留中にレコードがロックされる可能性があるため、注意が必要です。
Greg Ogle

私は通常、Oracle用のSQL Developerを使用しており、実行後も自動的にコミットされることはありません。プレビューしてからコミットします。かっこいい機能!!
lakshminb7 2008年

3

データは常にスクリプトを介してライブにデプロイする必要があります。スクリプトは、開発で正しく取得するために必要な回数だけリハーサルできます。スクリプトがdevで正しく実行されるための依存データがある場合は、適切にステージングします。本当に注意したい場合は、この手順を実行できません。




2

@ Wayneが言ったことに追加するにWHEREは、DELETEorUPDATEステートメントのテーブル名の前にを記述します。


2

データをバックアップします。顧客データベースを定期的に操作するのが難しい方法の1つであることを学びました。



2

私のルール(アプリ開発者として):触れないでください!それが訓練を受けたDBAの目的です。一体、私はそれに触れる許可さえ欲しくない。:)


2

環境ごとに異なる色:PL \ SQL開発者(IDE for Oracle)をセットアップして、本番DBにログオンしたときにすべてのウィンドウが明るい赤で表示されるようにしました。開発とテストにも異なる色を割り当てるところまで行った人もいます。




1
  1. 可能であれば、誰かとペアリングするように依頼してください
  2. Enterキーを押す前に、常に3まで数えます(単独の場合、ペアパートナーを激怒させるためです!)

1

スクリプトを使用してデータベースを更新する場合、誤って実行/実行を実行した場合に備えて、スクリプトの先頭にブレークポイントを1つまたは2つ配置するようにしてください。


1

UPDATEの前にBEGINTRANを実行することの推奨事項に追加しますが、実際にCOMMITを実行することを忘れないでください。コミットされていないトランザクションを開いたままにしておくと、同じくらいのダメージを与えることができます。更新の最中に電話、同僚、昼食などに気を取られないでください。そうしないと、コミットまたはロールバックするまで、他の全員がロックされていることに気付くでしょう。


1

Query Analyzerでアドホッククエリを書き出すときは、破壊的なクエリ(挿入、更新、削除、削除、変更)を常にコメントアウトします。そのように、それらを実行する唯一の方法は、コメントされた部分を選択せず​​にそれらを強調表示し、F5を押すことです。

また、すでに述べたように、最初にwhereステートメントをselectで記述し、正しいデータを変更していることを確認することもお勧めします。


1
  1. 変更する前に必ずバックアップしてください。
  2. 常にスクリプトを介してmod(ALTER TABLEなど)を作成します。
  3. 常にストアドプロシージャを介してデータを変更します(例:DELETE)。

1

読み取り専用ユーザーを作成し(またはDBAに実行させ)、そのユーザーのみを使用してDBを確認します。スキーマに適切な権限を追加して、ストアドプロシージャ/ビュー/トリガーなどのコンテンツを表示できるようにします。しかし、それらを変更する機能はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.