ストアド プロシージャを表す SQL ファイルが多数あります。これらのストアド プロシージャはデータベース内で暗号化されています。
これらのストアド プロシージャのどれが特定のテーブルに UPDATE または INSERT されているかを検出できるツールはありますか?
たぶん、NOTEPAD++ 正規表現がこれを達成するのに役立つでしょうか?
ストアド プロシージャを表す SQL ファイルが多数あります。これらのストアド プロシージャはデータベース内で暗号化されています。
これらのストアド プロシージャのどれが特定のテーブルに UPDATE または INSERT されているかを検出できるツールはありますか?
たぶん、NOTEPAD++ 正規表現がこれを達成するのに役立つでしょうか?
まず、ストアド プロシージャの定義またはそのメタデータから、このプロシージャが特定のテーブルに対して挿入または更新を実行することを明確に示す情報を取得する方法はありません。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
ます。
現在、これは多くの誤検知につながる可能性があります。
tablename
実際には、他の長いオブジェクト名に含まれています (たとえば、私がよりも好む理由の 1 つです) Customers
。Customer
ただし、適切な一連の手順を特定したことを確信するために、実行しなければならない手動作業が最小限になるように、リストを絞り込む必要があります。自動化された文字列解析では、多くの同じ「誤検知」の理由で 100% 到達することはできません。また、動的 SQL を使用し、入力変数からテーブル名またはコマンド全体を作成するプロシージャがある場合があることを忘れないでください。文字列解析でもそれらを見つけることはできません。
これは私のために働いた:
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