4

ストアド プロシージャを変更し、別の開発者が行った変更を知らずに上書きしてしまいました。変更を元に戻し、古いスクリプトを元に戻す方法はありますか?

残念ながら、私はそのデータベースのバックアップを持っていないので、そのオプションは除外されています。

4

8 に答える 8

10

答えはイエスです。元に戻すことはできますが、簡単ではありません。すべてのデータベースは、データベースに加えられたすべての変更をログに記録します。必要がある:

  1. サーバーをシャットダウンします (または、少なくとも読み取り専用モードにします)。
  2. サーバーの完全バックアップを取る
  3. 事故が発生した前にさかのぼるすべての db ログ ファイルのコピーを取得します。
  4. バックアップを別のサーバーに復元する
  5. データベース管理ツールを使用して、事故を「元に戻す」までログファイルをロールバックします
  6. ストアド プロシージャ内の復元されたコードを調べて、現在のバージョンにコードを戻します。

そして最も重要なことは、ソース管理下でストアド プロシージャ コードを取得することです。

多くの人はこの概念を理解していません。データベースに変更を加えることしかできません。ファイルを以前のバージョンに置き換えることによってアプリケーション コードでできるように、ストアド プロシージャ バージョンをロールバックすることはできません。「ロールバック」するには、ストアド プロシージャを削除/定義する変更をさらに加える必要があります。

ニッチピッカーへの注意: 「ロールバック」とは、「トランザクションのロールバック」を意味するものではありません。つまり、変更を加えて、サーバーがバックアップされたら、変更が不適切であると判断したということです。

于 2011-07-18T22:14:49.310 に答える
3

バックアップを使用するか、ソース管理から復元するかの適切なアドバイスに加えて (どちらも行っていない場合は開始する必要があります)、 @MladenPrajdicからSSMS Tools Packを入手することも検討できます。. 彼の Management Studio アドインを使用すると、作業または実行したすべてのクエリの実行履歴を保持できるため、時間をさかのぼって以前のバージョンを確認するのは非常に簡単です。他の誰かが最後の既知の適切なバージョンで作業した場合、それは役に立ちませんが、チーム全体がそれを使用している場合、誰でも戻って実行されたバージョンを見ることができます. 保存する場所 (独自のファイル システム、ネットワーク共有、またはデータベース) を指定し、自動保存が開始される頻度を微調整できます。特にバックアップや/またはが面倒な場合は、本当に貴重な機能です。ソース管理 (繰り返しますが、本番サーバーに再び触れる前に、これらのことを行う必要があることを強調します)。

于 2011-07-18T22:52:21.737 に答える
3

「変更を元に戻し、古いスクリプトに戻す方法はありますか?」

簡単な答え: いいえ。

:-(

于 2011-07-18T22:01:31.380 に答える
3

キャッシュされた実行計画に目を通し、同僚が変更を加えた実行計画を見つけて、関連する部分を再度実行することができます。

編集

ボヘミアンは、TL に変更があれば良い答えを出しているように見えますが、これは私が話していることです。計画の SQL テキストを確認します。

SELECT  cached.*,
               sqltext.*
         FROM  sys.dm_exec_cached_plans cached
  CROSS APPLY  sys.dm_exec_sql_text (cached.plan_handle) AS sqltext

しかし、squillman が指摘するように、DDL には実行計画がありません。

于 2011-07-18T22:02:19.863 に答える
2

データベース側からそれを取り戻すことはできません。この時点での選択肢は、1) バックアップから復元する、2) ソース管理に移動する、または 3) 他の誰かがどこかのエディターでまだコピーを持っているか、ファイルに保存していることを願う、の 3 つにかなり制限されています。

これらのどちらも選択できない場合は、「定期的にバックアップを取り、ソース管理を使用する必要があります」という義務があります....

于 2011-07-18T22:02:00.020 に答える
1

これについてはゲームにかなり遅れていますが、今朝同じことをしたところ、過去のある時点でスクリプトを保存するのを忘れていたため、回復する必要があることがわかりました。(これを修正したら、ソース管理になります!!!)

バックアップからの復元について言及した人もいましたが、バックアップがあればこれがどれほど簡単かについては誰も言及していませんでした。さらに、本番データベースのロールバックに縛られることもありません。これが鍵だと思います。バックアップがあると仮定すると、これは最良の回答に投票されたものよりもはるかに優れた代替手段であると言えます.

バックアップを取って、新しいデータベースに復元するだけです。探している SP を引き出すと、不足しているコードが復元されました。

不足しているファイルを回復したら、新しく作成したデータベースを削除することを忘れないでください。

于 2012-09-21T14:54:07.880 に答える
0

Management Studio オブジェクト エクスプローラーからストアド プロシージャをスクリプト化した場合、これは機能します。オブジェクト エクスプローラーを展開して折りたたむ前に、スクロールして開いたストアド プロシージャをポイントします。オブジェクト エクスプローラーがまだ更新されていないため、ストアド プロシージャを create または alter としてスクリプト化すると、以前のバージョンの proc を取得できます。これはいつも私の命の恩人です。

于 2015-11-23T21:07:38.150 に答える