2

ストアド プロシージャを表す SQL ファイルが多数あります。これらのストアド プロシージャはデータベース内で暗号化されています。

これらのストアド プロシージャのどれが特定のテーブルに UPDATE または INSERT されているかを検出できるツールはありますか?

たぶん、NOTEPAD++ 正規表現がこれを達成するのに役立つでしょうか?

4

3 に答える 3

11

まず、ストアド プロシージャの定義またはそのメタデータから、このプロシージャが特定のテーブルに対して挿入または更新を実行することを明確に示す情報を取得する方法はありません。SQL Server は、そのタイプの情報を保持していません。RegEx は近いかもしれませんが、誤りやすい文字列パターンに依存しています。

さて、あなたの特定のケースでは、暗号化の複雑さが追加されています。ストアド プロシージャの定義を解読できるツールが世の中にあり、それらを検索することができます (ここでそれらを渡さないのは倫理上の理由があります)。

それまでの間、テキスト ファイルに暗号化されていないバージョンがあるため、それらを使用して、暗号化せずに一時的にダミー データベースにプロシージャを作成することをお勧めします (このオプションを削除するには、何らかの検索と置換を行う必要があります)。プロシージャ宣言から)。次に、組み込みのメタデータ (OBJECT_DEFINITION()または などsys.sql_modules) を使用して、テキスト ファイルの場合と同様にテキストを解析できます。UPDATEプロシージャが作成されたら (これも暗号化されていません)、テーブル名を指定する前にキーワードを使用するストアド プロシージャを見つけるために、次のようなことができます。

SELECT s.name, p.name, m.definition
  FROM sys.schemas AS s
  INNER JOIN sys.procedures AS p
  ON s.[schema_id] = p.[schema_id]
  INNER JOIN sys.sql_modules AS m
  ON p.[object_id] = m.[object_id]
  WHERE UPPER(m.definition) LIKE N'%UPDATE%TABLENAME%';

そして、それを変更 (または追加OR) して handle にしINSERTます。

現在、これは多くの誤検知につながる可能性があります。

  • 1 つのテーブルを更新し、対象のテーブルから選択します
  • コメントに更新があります
  • tablename実際には、他の長いオブジェクト名に含まれています (たとえば、私がよりも好む理由の 1 つです) CustomersCustomer

ただし、適切な一連の手順を特定したことを確信するために、実行しなければならない手動作業が最小限になるように、リストを絞り込む必要があります。自動化された文字列解析では、多くの同じ「誤検知」の理由で 100% 到達することはできません。また、動的 SQL を使用し、入力変数からテーブル名またはコマンド全体を作成するプロシージャがある場合があることを忘れないでください。文字列解析でもそれらを見つけることはできません。

于 2013-08-09T15:01:13.197 に答える
7

これは私のために働いた:

select distinct o.name, o.type_desc, dep.is_updated
FROM sys.sql_modules   m 
INNER JOIN sys.objects o ON m.object_id=o.object_id
INNER JOIN sys.sql_dependencies dep ON m.object_id = dep.object_id
INNER JOIN sys.columns col ON dep.referenced_major_id = col.object_id
INNER JOIN sys.tables tab ON tab.object_id = col.object_id
WHERE tab.name = 'BasketOrderForm'
and is_updated = 1
ORDER BY O.name

結果は次のとおりです。

Name                                    type_desc               is_updated
procBasketHelperMergeBasketOrderForms   SQL_STORED_PROCEDURE    1   
procListImport_Baskets                  SQL_STORED_PROCEDURE    1   
procListTransferInsertBasketOrderForm   SQL_STORED_PROCEDURE    1   
procTS360SubmitBasket                   SQL_STORED_PROCEDURE    1   
procTS360TransferBasketToUsers          SQL_STORED_PROCEDURE    1   
tdBasketLineItems                       SQL_TRIGGER             1   
tuBasketOrderForm                       SQL_TRIGGER             1
于 2015-12-04T19:53:24.343 に答える