2

私たちは現在、APP1約 800 のストアド プロシージャ、600 のテーブルなどを持つ SQL データベースを使用するアプリケーションを開発しています。これは、APP1元は別のアプリケーションを置き換えるために作成されたものでAPP0、ソース コードはありませんが、SQL のみがあります。テーブル、ストアド プロシージャ、ビューなど。 の以前のプログラマーはAPP1、この同じデータベースからいくつかの DB オブジェクトを使用し、 に固有の他のオブジェクトをいくつか追加しましAPP1APP0。そして、私たちが望むすべてのものと同様に、私たちはAPP0もう必要としませんAPP1

そこで、 だけが使用しているオブジェクトAPP1を削除するために、が使用しているオブジェクトを見つける方法を考えています。APP0

APP1すべてのクラスとフォームを開かずに、使用されているすべてのオブジェクトを検出するための最良の方法は何ですか?

これらのオブジェクトの完全なリストがあれば、購入したプログラムを使用して、SQL から直接指定されたすべての SQL オブジェクトのすべての依存関係を検出し、依存関係から返されないオブジェクトを削除するのは簡単です。非常に多くのクラスとフォームを持つすべてのプログラムを実行する必要なく、このリストを取得する方法についてのアイデアはありますか?

ありがとう、

注 : 完璧な世界では、PS とテーブルへのすべての呼び出しは DAL で行う必要があることはわかっていますが、現在取り組んでいるアプリケーションの場合は ... これは私たちの場合ではありません! ヤッピー!(皮肉なイッピー) ;)

注 2 : このアプリケーションは ORM を使用していません。したがって、すべてのクエリは SqlCommand を直接使用しています。したがって、DB オブジェクトへの呼び出しは文字列形式です。

4

3 に答える 3

1

APP0 のすべてのテーブル、Sprocs などがあるとおっしゃいました。おそらく、それらの BAK があるか、新しい PC に APP0 をインストールすることで元の SQL オブジェクトを取得できます。

次に、RedGate のSQL Compare を使用して、APP1 が使用するデータベースを元の APP0 データベースと比較します。追加したオブジェクトを確認し、冗長な APP0 db オブジェクトをすべて取り除くことができます。

于 2012-05-11T02:45:44.317 に答える
0

アプリケーションの使用中にデータベースでトレースを実行できます。これにより、かなり大量のデータが作成される可能性がありますが、そこから、アプリケーションによって実行されるプロシージャや SQL ステートメントに減らすことができます。

すべての機能を使用する、または使用できることを保証できますか? また、NCover のようなものを実行して、使用中に実行したアプリケーション コードの量を確認することもできます。

于 2012-05-10T18:51:19.797 に答える
0

簡単な答えはありませんが、これが私がそれを攻撃する方法です。これにはかなりの時間がかかることを前もって認めているので、より良い答えを持っている人にすぐに譲ります.

二段階の問題です。

ステップ 1: SQL 内のすべての依存関係を見つけます。つまり、ビューの作成に使用されるすべてのテーブルを検索し、ストアド プロシージャと関数で使用されるすべてのテーブルとビューを検索します。MS SQL サーバーには、これを行う機能があります。他の DB では、information_schema (または独自の同等のもの) に対していくつかのクエリを作成できます。

ステップ 2: コード内から実行されたすべての SQL ステートメントとストアド プロシージャのリストを取得します。その場で SQL ステートメントを作成しない場合、これは比較的簡単です。すべての SQLCommand オブジェクトを検索して、クエリに設定したものを見つけるだけです。ソースをスキャンしてこれをダンプする小さなプログラムを作成できます。

次に、このダンプを解析して、参照される sproc、テーブル、およびビューのリストを作成します。アルファベット順に並べ替え、重複を排除します。次に、sprocs から参照されるすべてのテーブルまたはビュー、およびビューから参照されるすべてのテーブルを追加します。重複を再度並べ替えて削除します。次に、リストを取得します。

その場で SQL を生成すると、複雑さのレベルが大幅に増加すると思います。次に、SQL を生成し、テーブル名を選択するコードを実行する必要があります。テーブル名が関数から関数に渡される場所がある場合、これは非常に困難になる可能性があります。(ユーザーにテーブル名を入力するように依頼したり、断片からテーブル名を作成したりするなど、実際の悪夢のようなシナリオを想像できます。「dim tablename = if(dept="B17","accounting", "manufacturing" のように) & "_" & 年"。)

于 2012-05-10T21:31:25.510 に答える