web-dev-qa-db-ja.com

ストアドプロシージャが使用されている場所を見つける方法

SQL Server 2000を使用して、すべてのトリガープロシージャでパターンをグローバルに検索する方法はありますか?

ストアドプロシージャが呼び出されている場所は、私から隠れています。

これは私の最初の投稿ですので、親切にしてください。

8
user2141302

これにより、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%';

もちろん、ここにはいくつかの危険があります。

  1. syscommentsは、4000行を超えるプロシージャを実行し、それらを複数の行に分割します。そのため、大規模なプロシージャが境界点の検索文字列のみに言及し、まったく表示されない可能性がわずかにあります。このようなプロシージャがリストに2回表示される可能性もあります(GROUP BYを追加してそれを削除できます)。
  2. 誤検知に注意してください。検索文字列をコメントに含めることができます。または、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%' ..でサーバー側のトレースフィルタリングを実行します。

16
Aaron Bertrand

SQL Server 2017の使用SQL Server Management Studioの使用

オブジェクトエクスプローラーでプロシージャの依存関係を表示するには

  • オブジェクトエクスプローラーで、データベースエンジンのインスタンスに接続し、それを展開します
  • インスタンス。
  • [データベース]を展開し、プロシージャが属するデータベースを展開してから、[プログラマビリティ]を展開します。
  • [ストアドプロシージャ]を展開し、プロシージャを右クリックして、[依存関係の表示]をクリックします。
  • 手順に依存するオブジェクトのリストを表示します。
  • 手順が依存するオブジェクトのリストを表示します。
  • [OK]をクリックします。

Transact-SQLの使用
次の手順に従うことができます ここ

詳細については、元の記事を確認してください。
https://docs.Microsoft.com/en-us/sql/relational-databases/stored-procedures/view-the-dependencies-of-a-stored-procedure?view=sql -サーバー-2017

2
George Botros

これは私が書いたプロシージャで、システムテーブルからソースを取得し、それを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
0
Ab Bennett