5

実稼働テーブルのすべてのレコードを誤って更新することが数回ありました。注意力の欠如など...

このような事故を防ぐために、MySQL はコンパイル/実行時の切り替えになっていると聞いたことがあります。のように、もし私がするなら

UPDATE Table SET Field=0

WHERE 句がないため、これはコンパイル/実行されません。そして、本当にすべてを更新したい場合は、次のことができます

UPDATE Table SET Field=0 WHERE 42=42

MS SQL に関するアイデアはありますか?

トリガーを参照して、オンラインでいくつかの回答を見つけました。それは私が推測する少し費用がかかるでしょう。つまり、必要なすべてのテーブルにトリガーを配置する必要があります。

4

5 に答える 5

4

これを全員に設定しようとしている場合は、IMPLICIT_TRANSACTIONS をオンにして、SQL Server の自動コミット機能をオフにすることができます。ここ を参照してください

心配しているのはあなただけの場合は、上記をセッションで使用することもできますSET IMPLICIT_TRANSACTIONS ON。次に、実際に COMMIT を呼び出して、何かを固定する必要があります。ここ を参照してください

于 2013-01-21T22:07:01.457 に答える
2

他の人が言ったこと (MySQL セーフ アップデート モード、本番環境へのアクセスを制限、最初に開発サーバーでテスト) に加えて、SQL ウィンドウでこのような更新ステートメントを書くように自分自身を訓練することは難しくありません。

update
set
where

次に、先頭に戻り、詳細を入力します。これにより、WHERE 句を省略できなくなりますが、不適切な WHERE 句を作成することはできなくなります。ローカル マシンの SQL ウィンドウで SQL を書いているときでさえ、これを常に行っています。

最善の方法は、お好みのテキスト エディターであるemacsで SQL を記述し、"UPDATE" を WHERE 句を含む部分ステートメントに展開するようにプログラムすることです。

だれかが尋ねる前に、私はこのような複雑な WHERE 句も書きます。

where ()

に続く

where (() or ())

それから

where ((() and ()) or ())

次に、戻って条件を入力します。

私は何年も前に C で多くのコードを書かなければならなかったときにこの習慣を身につけました。これは、このような「if」ステートメントを書くように自分自身を訓練したことに由来します。括弧と中括弧を省略すると、他の人が多くの頭痛の種になるので、その可能性を排除しました。

if () {
}
于 2013-01-21T12:46:01.510 に答える
2

このような場合、コマンドを発行する前にいつでもトランザクションを開始できますがCOMMIT、末尾に a を追加する必要はありません。そうすれば、クエリが目的の効果を持っていることを確認できます。そうであれば、手動でCOMMIT. 間違えた場合は、単にROLLBACK.

テーブルにトリガーを追加して INSERTS や UPDATES が発生しないようにすることもできますが、それはあなただけでなくすべての人に影響します。

肝心なのは、実稼働システムでテストされていないクエリを実行してはならないということです;) 代わりに、データベースのスナップショット コピーを使用してください。

于 2013-01-21T12:40:41.950 に答える
1

いつも使う習慣をつけてみませんか?

UPDATE TOP (2) dbo.table set name = etc

1 行だけを更新したいことがわかっているとします。「2行が影響を受けました」と返された場合、タイプミスをしたことがわかりますが、少なくともenireテーブルを破壊していません.

于 2016-02-22T03:20:26.510 に答える
0

他のグッド プラクティスが前に述べたように: prod db へのアクセスを許可しないでください。場所なしで update を実行しないでください。それらに異なるユーザーとセキュリティポリシーを使用するように追加します。万一に備えて元に戻せるように、適切なログを維持してください。テーブル全体を更新すると、そのサイズによっては、テーブル全体がロックされる場合があります。

于 2013-01-21T12:04:47.510 に答える