SQL Server 2000を使用して、すべてのトリガープロシージャでパターンをグローバルに検索する方法はありますか?
ストアドプロシージャが呼び出されている場所は、私から隠れています。
これは私の最初の投稿ですので、親切にしてください。
これにより、SQL Server 2000のトリガー、プロシージャ、関数、およびビューが検索されます(新しいバージョンでは、このアプローチをお勧めしません。 より良い方法についてはこのブログ投稿を参照 ):
SELECT o.name
FROM syscomments AS c
INNER JOIN sysobjects AS o
ON c.id = o.id
WHERE c.text LIKE '%procedurename%';
もちろん、ここにはいくつかの危険があります。
syscomments
は、4000行を超えるプロシージャを実行し、それらを複数の行に分割します。そのため、大規模なプロシージャが境界点の検索文字列のみに言及し、まったく表示されない可能性がわずかにあります。このようなプロシージャがリストに2回表示される可能性もあります(GROUP BY
を追加してそれを削除できます)。GetAuthorSubscriptions
という名前のストアドプロシージャがあり、%GetAuthors%
を探している場合でも、それは表示されます。 COLLATE
句で大文字と小文字を区別する検索を使用すると役立つ場合がありますが、必ずしもそれを排除するわけではありません。詳細はこちら:
http://databases.aspfaq.com/database/how-do-i-find-a-stored-procedure-taining-text.html
SQL Server 2000から移行することを強くお勧めします。80億の他の利点がなければ、このタスクはより新しいバージョンではるかに簡単です。
ストアドプロシージャがデータベース内から呼び出されない可能性があることに注意してください。アプリ、誰かのManagement Studioのオープンコピー、またはジョブからのアドホック呼び出しである可能性があります。使用できる求人を検索するには:
SELECT
job_name = j.name,
s.step_name
FROM msdb.dbo.sysjobs AS j
INNER JOIN msdb.dbo.sysjobsteps AS s
ON j.job_id = s.job_id
WHERE s.command LIKE '%procedurename%';
まだそれを上げていませんか? TextData LIKE '%procedurename%'
..でサーバー側のトレースフィルタリングを実行します。
SQL Server 2017の使用SQL Server Management Studioの使用
オブジェクトエクスプローラーでプロシージャの依存関係を表示するには
Transact-SQLの使用
次の手順に従うことができます ここ
詳細については、元の記事を確認してください。
https://docs.Microsoft.com/en-us/sql/relational-databases/stored-procedures/view-the-dependencies-of-a-stored-procedure?view=sql -サーバー-2017
これは私が書いたプロシージャで、システムテーブルからソースを取得し、それを1行ずつテーブルに配置します。これにより、テキストのスキャンが容易になり、テキストが折り返されるためにシステムテーブルで途切れる可能性のある文字列に対応できるようになります。これを毎日または毎時などで実行すると、ほぼリアルタイムの結果が得られます。
V $ sourceテーブルをスキャンして、プロシージャ名の個別のリストを取得できますが、ソリューション全体をここに配置すると便利だと考えられます。
徹底的にテストされていないので、バグがある場合はお知らせください。
CREATE TABLE [dbo].[v$source](
[theDb] [varchar](100) NULL,
[theLineNo] [int] NULL,
[theName] [varchar](1000) NULL,
[theText] [varchar](8000) NULL,
[theType] [varchar](100) NULL,
[theCreateDate] [datetime] NULL,
[theOrderNum] [int] NULL,
[DateCreated] [datetime] NULL,
[DateUpdated] [datetime] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[v$source_unsplit](
[theDb] [varchar](100) NULL,
[theName] [varchar](1000) NULL,
[theText] [varchar](8000) NULL,
[theType] [varchar](100) NULL,
[theCreateDate] [datetime] NULL,
[theOrderNum] [int] NULL,
[DateCreated] [datetime] NULL,
[DateUpdated] [datetime] NULL
) ON [PRIMARY]
GO
CREATE FUNCTION [dbo].[GetLHS]
(
@p_delim varchar(1),
@p_string varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
declare @l_pos int;
set @l_pos = charindex(@p_delim,@p_string,1);
--if (@l_pos = 0)
-- return @p_string;
return substring(@p_string,1,iif(@l_pos=0,len(@p_string),@l_pos-1));
END
CREATE FUNCTION [dbo].[GetRHS]
(
@p_delim varchar(1),
@p_string varchar(max)
)
RETURNS varchar(max)
AS
BEGIN
declare @l_pos int;
set @l_pos = charindex(@p_delim,@p_string,1);
if (@l_pos = 0)
return '';
return substring(@p_string,@l_pos+1,len(@p_string));
END
CREATE PROCEDURE sp_bld_v$source
AS
BEGIN
delete from v$source_unsplit
EXEC sp_MSforeachdb
'USE ?;
insert into dict..v$source_unsplit (TheDB,TheName,TheText,TheType,TheCreateDate,TheOrderNum)
SELECT ''?'' thedb, o.name, substring(c.Text,1,8000),xtype,crdate,colid
FROM syscomments AS c
INNER JOIN sysobjects AS o
ON c.id = o.id'
delete from v$source
DECLARE @C_TEXT_CURSOR as CURSOR;
DECLARE @l_thedb varchar(1000)
DECLARE @l_thename varchar(1000)
DECLARE @l_theordernum int
DECLARE @l_text varchar(max)
DECLARE @l_lhs varchar(max) = 'NULL'
DECLARE @l_line_no int
DECLARE @l_createDate datetime
declare @l_thetype varchar(10)
SET @C_TEXT_CURSOR = CURSOR FOR
select theDb,TheName,theOrderNum,thetext,theCreateDate,thetype--,replace(theText,char(10),'@^@')
from v$source_unsplit
order by theDb,TheName,theOrderNum
OPEN @C_TEXT_CURSOR;
FETCH NEXT FROM @C_TEXT_CURSOR INTO @l_thedb,@l_thename,@l_theordernum,@l_text,@l_createDate,@l_thetype
WHILE @@FETCH_STATUS = 0
BEGIN
if @l_theordernum = 1
begin
set @l_line_no = 1
if @l_lhs <> 'NULL'
begin
insert into v$source (TheDB,TheLineNo,TheName,TheText,TheType,TheCreateDate,TheOrderNum)
select @l_thedb,@l_line_no,@l_thename,@l_lhs,@l_thetype,@l_createDate,@l_theordernum
end
end
else
begin
set @l_text = @l_lhs+@l_text -- reconstuct previous line
end
while charindex(char(10),@l_text)>0
begin
set @l_lhs = lib.dbo.GetLHS(char(10),@l_text)
set @l_text = lib.dbo.GetRHS(char(10),@l_text)
insert into v$source (TheDB,TheLineNo,TheName,TheText,TheType,TheCreateDate,TheOrderNum)
select @l_thedb,@l_line_no,@l_thename,@l_lhs,@l_thetype,@l_createDate,@l_theordernum
--print(@l_text)
set @l_line_no = @l_line_no+1
end
set @l_lhs = @l_text
FETCH NEXT FROM @C_TEXT_CURSOR INTO @l_thedb,@l_thename,@l_theordernum,@l_text,@l_createDate,@l_thetype
END
CLOSE @C_TEXT_CURSOR;
DEALLOCATE @C_TEXT_CURSOR;
END
GO