SQLServer の一つを後継機に移行する上で、影響オブジェクトを調べたい


SQLServerを幾つか有している状況で、そのうちの一つが機器老朽化から後継機への移行を予定中です。  
互いのSQLServerはデータ連携を目的に相互のデータ参照・登録・更新を達成してきており、ストアド・ビュー・ジョブといった各オブジェクトの中で、移行対象のSQLServerが定義されてしまっている部分を洗い出したいと考えています。（主にリンクサーバとしての参照が濃厚）

ビューやジョブのデザインを一覧でダウンロードするようなユーティリティはありませんでしょうか？  
机上で目をとおし 影響の出ているオブジェクトだけ対策を投じたいと思っています。




SQL Serverには[システムカタログビュー](https://docs.microsoft.com/ja-jp/sql/relational-
databases/system-catalog-views/catalog-views-transact-
sql)と呼ばれるオブジェクト情報を取得するためのビューが多数定義されています。たとえばSQLで定義されたビューやストアドプロシージャのソースは`sys.sql_modules`から

[code]

    SELECT object_id, definition FROM sys.sql_modules
    
[/code]

のように参照できます。基本的にはここからソースコードを取得し、対象サーバー名を検索すれば可能です。

またリンクサーバー使用時にはシノニムを定義することも多いかと思いますが、`[server_name]`内のオブジェクトに対するシノニムは

[code]

    SELECT object_id, name FROM sys.synonyms WHERE base_object_name LIKE '[[]server_name].%'
    
[/code]

のように抽出でき、これらの`object_id`を`sys.sql_dependencies`の`referenced_major_id`から検索するとシノニムを使用しているSQLモジュールのオブジェクトIDが分かります。

[code]

    SELECT * FROM sys.objects
     WHERE object_id IN(
        SELECT d.object_id
          FROM sys.synonyms s
         INNER JOIN sys.sql_dependencies d
            ON s.object_id = d.referenced_major_id
         WHERE s.base_object_name LIKE '[[]server_name].%')
    
[/code]

## 追記

文字列検索より直接的なカタログビューがありました。`sys.sql_expression_dependencies`には`referenced_server_name`がありますので、ここを見れば直接参照しているSQLモジュールが分かります。

[code]

    SELECT *
      FROM sys.objects
     WHERE object_id IN (
        SELECT referencing_id
          FROM sys.sql_expression_dependencies
         WHERE referenced_server_name = 'server_name')
    
[/code]




SQL Serverには[システムカタログビュー](https://docs.microsoft.com/ja-jp/sql/relational-
databases/system-catalog-views/catalog-views-transact-
sql)と呼ばれるオブジェクト情報を取得するためのビューが多数定義されています。たとえばSQLで定義されたビューやストアドプロシージャのソースは`sys.sql_modules`から

[code]

    SELECT object_id, definition FROM sys.sql_modules
    
[/code]

のように参照できます。基本的にはここからソースコードを取得し、対象サーバー名を検索すれば可能です。

またリンクサーバー使用時にはシノニムを定義することも多いかと思いますが、`[server_name]`内のオブジェクトに対するシノニムは

[code]

    SELECT object_id, name FROM sys.synonyms WHERE base_object_name LIKE '[[]server_name].%'
    
[/code]

のように抽出でき、これらの`object_id`を`sys.sql_dependencies`の`referenced_major_id`から検索するとシノニムを使用しているSQLモジュールのオブジェクトIDが分かります。

[code]

    SELECT * FROM sys.objects
     WHERE object_id IN(
        SELECT d.object_id
          FROM sys.synonyms s
         INNER JOIN sys.sql_dependencies d
            ON s.object_id = d.referenced_major_id
         WHERE s.base_object_name LIKE '[[]server_name].%')
    
[/code]

## 追記

文字列検索より直接的なカタログビューがありました。`sys.sql_expression_dependencies`には`referenced_server_name`がありますので、ここを見れば直接参照しているSQLモジュールが分かります。

[code]

    SELECT *
      FROM sys.objects
     WHERE object_id IN (
        SELECT referencing_id
          FROM sys.sql_expression_dependencies
         WHERE referenced_server_name = 'server_name')
    
[/code]

