何百ものテーブルとストアド プロシージャを含む巨大なデータベースがあります。SQL Server 2005 を使用して、特定のテーブルで挿入または更新操作を実行しているストアド プロシージャのリストを取得するにはどうすればよいですか。
7 に答える
sys.sql_dependencies
sproc がクエリに含めるテーブルや列など、依存関係を持つエンティティのリストがあります。依存関係を取得するクエリの例については、この投稿を参照してください。以下のコード スニペットは、ストアド プロシージャによってテーブル/列の依存関係のリストを取得します。
select sp.name as sproc_name
,t.name as table_name
,c.name as column_name
from sys.sql_dependencies d
join sys.objects t
on t.object_id = d.referenced_major_id
join sys.objects sp
on sp.object_id = d.object_id
join sys.columns c
on c.object_id = t.object_id
and c.column_id = d.referenced_minor_id
where sp.type = 'P'
select
so.name,
sc.text
from
sysobjects so inner join syscomments sc on so.id = sc.id
where
sc.text like '%INSERT INTO xyz%'
or sc.text like '%UPDATE xyz%'
これにより、特定のテーブルの INSERT または UPDATE を含むすべてのストアド プロシージャ コンテンツのリストが得られます (明らかにクエリを調整して調整できます)。また、返されるレコードセット内の複数の行にまたがる長いプロシージャは分割されるため、結果を手動でふるいにかける必要がある場合があります。
編集:SP名も返すようにクエリを微調整しました。また、上記のクエリは UDF と SP を返すことに注意してください。
Vyaskn の Web サイトから sp_search_code をダウンロードすると、データベース オブジェクト内の任意のテキストを検索できます。
http://vyaskn.tripod.com/sql_server_search_stored_procedure_code.htm
すべてのストアド プロシージャをテキスト ファイルにエクスポートしてから、単純な検索を使用できます。
より高度な手法は、正規表現検索を使用してすべての SELECT FROM および INSERT FROM エントリを見つけることです。
これはうまくいくようです:
select
so.name as [proc],
so2.name as [table],
sd.is_updated
from sysobjects so
inner join sys.sql_dependencies sd on so.id = sd.object_id
inner join sysobjects so2 on sd.referenced_major_id = so2.id
where so.xtype = 'p' -- procedure
and is_updated = 1 -- proc updates table, or at least, I think that's what this means
SELECT Distinct SO.Name
FROM sysobjects SO (NOLOCK)
INNER JOIN syscomments SC (NOLOCK) on SO.Id = SC.ID
AND SO.Type = 'P'
AND (SC.Text LIKE '%UPDATE%' OR SC.Text LIKE '%INSERT%')
ORDER BY SO.Name
このリンクは SP 検索のリソースとして使用されました。