間違ったデータベースを誤って変更するリスクを最小限に抑えるにはどうすればよいですか?


12

オブジェクトエクスプローラーでサーバーから切断しても、そのサーバーで既に開いているクエリウィンドウの実行が停止しないという難しい方法を学びました。

私の状況は次のとおりです。開発/ステージングサーバーと運用サーバーに接続するために使用するSSMSのインスタンスが1つあります。devで大量のデータを削除しなければならなかったため、本番環境への接続を閉じる必要があると考えましたが、使用しているクエリウィンドウには注意を払いませんでした。(幸運にも、ほんの数時間前のバックアップがありました。)

実稼働データを破壊するのは私が最初ではなく、最後になるとは思いません。そこで、間違ったデータベースでクエリを実行するリスクを最小限に抑えるのに役立つチェックリスト、ベストプラクティスなどを探しています。以前にこれを経験しましたか?また、これを回避するためにワークフローをどのように適合させましたか?


4
あなたがしていることに注意を払ってください。
swasheck

SQLツール(SSMSではない)を使用すると、データベースを変更する可能性のあるステートメントを単に拒否する「読み取り専用モード」を有効にできます。
a_horse_with_no_name

十分な睡眠と運動を得て、もっと注意を払ってください。

回答:


11

SSMSでやりたいことの1つは、データベースに接続するときにカスタムカラーを使用することです。したがって、Liveデータベースには明るい赤を選択し、開発システムまたはテストシステムには青または緑を選択します。以前は組み込みのSSMSを使用していましたが、最近はSSMS Tools Addon Colorコーディングが好まれています。

このような

または、SSMSツール用にこのようにします(本当に素晴らしいアドオンです。組み込みのように下よりも上にある方が色が良くなります) またはこれ


2
+1これは私がやることです。本番環境には赤、テスト環境には黄色、ローカル開発データベースには緑を使用します。ここでは、古い信号の比metaがうまく機能します。
LeopardSkinPillBoxHat

6

誰に尋ねるかにもよりますが、もう少し作業が必要になりますが、次のステートメントを常に使用する習慣がつきました。 すべてのすべての生産やプリプロダクションのクエリウィンドウ、およびUPDATEDELETEおよびINSERTすべての環境でのステートメント。

BEGIN TRAN
-- END OF QUERY WINDOWS
ROLLBACK TRAN
PRINT 'Transaction rolled back.'

これを見ると、すぐに「おっと、クエリウィンドウがまだ接続されていました」または「ああ、どうしようもないことを自動でやった」とすぐにわかります。クエリウィンドウは引き続き接続できます。私の考えでは、すべてのプロダクションクエリは強調表示されBEGIN TRAN、; で実行される必要があります。偶発的なF5がすべてではなく、すべてをロールバックする必要がありCOMMITます。これが行うことは、ユーザーに自分の行動を意識させることです。食事をとるたびに写真を撮るのと同じように、体重を減らすのに役立ちます。なぜなら、あなたがやっていることをやめて考えなければならないからです。

実行に時間がかかりますか?はい。エラーを100%停止しますか。はい、何もコミットしないCOMMITので、入力後に手動でを強制しない限り、それ自体が性質を考慮することを余儀なくされますCOMMIT


4
私もこのプラクティスについて説教しています(そして、それはSSMS Tools Packの別の機能です-新しいクエリテンプレートをカスタマイズできます)、反対のシナリオに注意する必要があります-BEGIN TRANとクエリを強調表示しますが、 COMMITまたはROLLBACKして、昼食、週末、または6か月の休暇のために建物を出るときに口leaveを吹きます。
アーロンバートランド

6

本番環境の変更用に2つ目のユーザーアカウントを作成し、アカウントに現在あるアクセス権を取り消します。本番環境で何かをしたいときは、2番目のユーザーとしてssmsを実行できます。

編集:これは、ドメインログインの場合にのみ有益です。2つの個別のドメインアカウントがある場合、DEVとPRODのSSMSの個別のインスタンスを使用する必要があります。ドメインアカウントを使用していない場合、この提案はあまり役に立ちません。

また、別のドメインアカウントを使用している場合は、ユーザーごとにSSMSの色設定を調整できます。PRODに接続するアカウントの背景が明るい赤になっている可能性があります。

ここでも頭に浮かんだの良いホワイトペーパーでは、次のとおりです。http://download.microsoft.com/download/D/2/D/D2D931E9-B6B5-4E3B-B0AF-22C749F9BB7E/SQL_Server_Separation_of_Duties_White_Paper_Jul2011.docx

毎日のログインアカウントに完全なSAアクセスを与えないことなどについて説明します。


どういうわけか、単一のSSMSインスタンスから複数のサーバーへのアクセスを無効にするということですか?または私は何を見逃しましたか?
アンドリーM

すでに別のユーザーアカウントを使用していますが、それがどのように役立つかはわかりません。
スティン

1
これは、ドメインアカウントを使用している場合にのみ本当に当てはまると思います。その場合、またはDEV接続とPROD接続にSSMSを使用する場合、別のインスタンスを使用するように強制する場合。たぶん私は... SSMSアドイン本番接続上でコードを実行しようとしたときに多分警告をポップアップ、このシナリオで役立つことが書いてます
マーク・ウィルキンソン

コメントにあるすべてのタイプミスを申し訳ありません。早朝の携帯電話による応答...しかし、あなたはアイデアを得る。:)
マークウィルキンソン

ええ、私はあなたの答えの要点を知りました:)おそらくあなたのコメントに答えを入れることができますか?
スティン

4

私のアドインをご覧ください:SSMSBoost。まさに必要なものが揃っています。現在のデータベースを追跡し、色を変更できるように、SSMSステータスバーの色付け機能を改善しました。さらに、「重要なDBアラート」フローティングツールチップを追加できます。

ここに画像の説明を入力してください

この機能の詳細については、http//www.ssmsboost.com/Features/ssms-add-in-preferred-connectionsをご覧ください。


2

私の仕事の1つで、この目的のためのツールを開発しました。

PRODでステートメントを実行する場合、次のように記述しなければなりません。

run_sql servername PROD <file_with_sqlstatements>.sql

結果をログファイルに書き込み、実行を管理データベースのログに追加します。たとえば、特定のテーブルを最後に変更したのは誰であるかを知りたいときに、非常に便利でした。

SSMSでは、サーバーを登録すると、特定の色を接続に適用できるため、たとえば、すべてのPROD接続の下部が赤色になります。ただし、可能な場合は、運用サーバーでGUIツールを使用しないことをお勧めします。


私は自分のマシンでのみSSMSを実行しています。接続文字列の色についてのすばらしいヒントです。
スティン

3
@Stijnは、組み込みの色機能がすべてのシナリオで機能するわけではないことに注意してください-クエリウィンドウを開く方法によって異なります。はるかに信頼性の高いもの(SSMS 2012+では無料ではありません)は、SSMS Tools Packです。Mladenは2014互換バージョンをリリースしました。
アーロンバートランド

@Aaronツールは非常に興味深いようです。試用版をご覧ください、ありがとう!
スティン

4
別の代替の色付けソリューションはSQLプロンプトにあります。これは無料ではありませんが、かなり気の利いたキットです。これにより、SSMSが行うように、タブの下部だけでなく上部のタブに色が付けられます。
マークシンキンソン

1

もう2つだけヒントがあります。これは、ここでは似たようなものがまだないからです。

  1. 私のワークフローでは、1つのウィンドウで複数のステートメントを使用することが多く、テキストを選択して実行するフローに非常に慣れています。しかし、テキストが選択されていない状態で誤ってF5キーを押し、結果としてウィンドウ内のすべてのステートメントを実行することは常に怖いです。したがって、新しいウィンドウを開くたびに、SQLがコンパイルを拒否するガベージSQLを入力することから始めます。これにより、バッチ全体が実行不能になります。(警告!で区切られた複数のバッチを使用する場合GOは、バッチごとにゴミが必要です。)

  2. 実稼働サーバーでデータ変更を行うとき(または、細心の注意が必要なとき)-暗黙的なトランザクションは非常に便利です(SET IMPLICIT_TRANSACTIONS ONオプションが新しいウィンドウごとに有効になるようにSSMSのオプションを変更するか、どちらかを変更します)。このようにして、トランザクションにないすべてのステートメントは、新しいトランザクションを開始します。意図したことを2回行ったことを確認した場合にのみコミットします。


0

本番データベースが構成されている唯一の Windowsユーザーを使用してみてください。このユーザーのカラーテーマ全体を赤に設定します。ユーザーをすばやく切り替えると、これは問題になりません。

決して開発マシン上にあるアカウントで本番認証情報を使用し。短い電話または同僚の質問とその後、あなたは喜んであなたの新しい試運転のためにすべてを削除しています...

別のオプション(同じ考え)は、異なるテーマのリモートデスクトップまたは仮想マシンを使用することです。


0

F5が押されたときにクエリウィンドウ内のすべての実行を防止するもう1つのやや単純な方法は、すべてのコンテンツを/ *および* /で囲み、全体をコメントにすることです。

コメントで囲まれていても、通常の方法で強調表示してF5を押すことで、必要なステートメントを実行できます。

注:この方法を選択した場合、構文の強調表示やオートコンプリートの恩恵を受けることはできませんが、それらの機能をあまり使用しない場合は、100%損傷しないようにそれらを犠牲にする価値があります。偶発的なF5を持つデータベース。

編集:また、クエリウィンドウ内のどこでも/ * * /を使用できません。そうしないと、後続のコードのコメントを誤って解除してしまいます。代わりに-表記を使用する必要があります。


-1

元の質問に関するswasheckのコメントに同意して、実行方法はどうですか...

@@ servername + '\' + @@ servicenameを選択します

... DMLを実行する前に、または接続しているインスタンスを確認するためにステータスバーを確認する前に、または間違いを犯した場合にロールバックできるようにトランザクションですべてのDMLを実行しますか?ここでは多くの素晴らしい提案がありますが、基本的に、潜在的に破壊的なDMLに関しては、ギミックはこれまでのところあなただけを取得します。私はいつもチェックし、ダブルチェックして、もう一度チェックします。少量のデータを扱う場合は、DMLの前に新しいテーブルをSELECT INTOし、DMLを実行し、比較を行って正常に機能することを確認してから、「バックアップ」テーブルを削除します。難なく終わらせた。

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