SQL Serverのデータリネージ:T-SQL、ストアドプロシージャ、および動的SQL

SQL Serverのデータリネージ これは、データが T-SQL コード内をどのように移動するかを示す列レベルのマップです。どのソース列が各ターゲット テーブル、ビュー、またはレポートに供給され、その過程でストアド プロシージャ、一時テーブル、 マージ ステートメント、および動的SQL。 Gudu SQLFlow 専用の SQL Server プロシージャル パーサーを使用して T-SQL を解析することで、そのマップを自動的に構築するため、SSMS の依存関係ビューのようにオブジェクト レベルで履歴が途切れることはありません。

今すぐお試しください: T-SQL ストアドプロシージャを貼り付けます 無料のSQL Server系統図作成ツール そして、数秒で列レベルの系統図を取得できます。

SQL Serverのデータリネージが見た目より難しい理由

ほとんどの SQL Server 環境では、実際に重要な変換ロジックは整然としたビューには存在しません。それはデータをステージングするストアドプロシージャに存在します。 #temp テーブル、ファクトテーブルにアップサート マージパラメータに基づいて分岐し、実行時に SQL 文字列を組み立てます。 sp_executesql また エグゼクティブカタログからオブジェクト定義を読み取るだけの系統追跡アプローチでは、プロシージャはブラックボックスとして扱われます。プロシージャが存在することはわかりますが、どの列がプロシージャを通過するかはわかりません。

そのコードから真の履歴情報を取得するには、データベースエンジンと同じようにT-SQLを解析する必要があります。つまり、プロシージャ本体内のすべてのステートメントのセマンティックモデルを構築し、一時テーブルやテーブル変数を通過する列を追跡し、文字列変数の中に隠されたSQLを解決する必要があります。これはコンパイラの問題であり、メタデータクエリの問題ではありません。そして、まさにSQLFlowのT-SQLパーサーは、この目的のために設計されています。

SSMSの依存関係ビューでわかることとわからないこと

SQL Serverには便利な依存関係ツールが付属しており、オブジェクトレベルの簡単な質問に対する最初の窓口として最適です。 sys.sql_expression_dependencies, sys.dm_sql_referenced_entitiesSSMS の「依存関係の表示」ダイアログでは、プロシージャ A がテーブル B を参照していることが確実にわかります。しかし、次のことはわかりません。

  • 列レベルのフロー。 カタログの依存関係はオブジェクトレベルで止まります。 usp_load_fact_sales タッチ ステージング販売dw.fact_salesしかし、それは違う 事実売上金額 から派生する ステージング販売金額 を通じて キャスト その間 ステージング.セールス.ロード_日付 行のみをフィルタリングします。
  • 流れの方向。 参照はデータフローではありません。テーブルから読み取ったデータとテーブルに書き込んだデータは同じ依存関係の行を生成します。データリネージは、どちらがソースでどちらがターゲットかを認識する必要があります。
  • 動的SQL。 文字列内に構築され、実行されるステートメント sp_executesql また エグゼクティブ これらは実行時まで存在しないため、依存関係カタログからは全く見えません。
  • 一時的なテーブルホップ。 #temp テーブルは tempdb また、依存関係のエンドポイントとして追跡されないため、それらを通過する系統はすべて半分に切断されます。

「この列を再入力すると下流で何が壊れるのか」や「どのソースフィールドがこの規制対象レポートにデータを提供しているのか」といった疑問に答えるには、T-SQL本体自体を解析する必要があります。これは、カタログが既に提供している機能の上にSQLFlowが追加するレイヤーです。

SQLFlowがT-SQLプロシージャの系統を追跡する方法

SQLFlowは、 汎用SQLパーサー(GSP), a commercial SQL compiler front-end developed since the mid-2000s and validated against roughly 13,600 per-dialect SQL test fixtures. Its SQL Server support is a dedicated T-SQL grammar, not a generic ANSI parser with exceptions bolted on, and it includes a full procedural parser for stored procedure bodies. Inside a procedure, SQLFlow resolves:

  • 一時テーブルとテーブル変数。 列は以下を通じて追跡されます SELECT ... INTO #staging, INSERT INTO @rows、そしてその後のすべての読み取り、したがって 3 ホップのパイプライン tempdb 一つの連続した系統の経路として現れる。
  • マージ 声明。 それぞれ 一致したら更新する一致しない場合は挿入する ブランチが分析され、ソース列がターゲット列にマッピングされ、 の上 間接的な血統としての状態。
  • 動的SQL。 SQLは変数に組み立てられ、 sp_executesql また エグゼクティブ スキップされるのではなく、解決されて解析される。これは、系統追跡ツールにおける最も一般的な盲点の1つである。
  • 手順パラメータ。 系統はパラメータ値を通して、それらを使用するステートメントへと流れます。
  • 通話グラフ。 プロシージャが他のプロシージャを呼び出す場合、SQLFlow は対話型のプロシージャ間呼び出しグラフを表示するため、個々のプロシージャだけでなく、ETL チェーン全体を確認できます。

実例:MERGEによるファクトテーブルへのステージング

SQL Serverのデータウェアハウスには必ずこのような手順が含まれています。これは、ステージング行を一時テーブルにクリーンアップし、その後ファクトテーブルにマージするロードプロシージャです。

CREATE PROCEDURE dbo.usp_load_fact_sales AS BEGIN SELECT s.order_id, s.customer_id, CAST(s.amount AS DECIMAL(18,2)) AS amount INTO #clean_sales FROM staging.sales s WHERE s.load_date = CAST(GETDATE() AS DATE); MERGE dw.fact_sales AS tgt USING #clean_sales AS src ON tgt.order_id = src.order_id WHEN MATCHED THEN UPDATE SET tgt.amount = src.amount WHEN NOT MATCHED THEN INSERT (order_id, customer_id, amount) VALUES (src.order_id, src.customer_id, src.amount); END

これをSQLFlowで実行すると、図が表示されます dw.fact_sales.amount 供給 ステージング販売金額 を通じて キャスト、 と #clean_sales 中間ホップとして表示されます。また、カタログクエリでは決して生成できない2つの関係も示しています。 ステージング.セールス.ロード_日付 すべての出力列への間接的な系統として(どの行をロードするかを決定します)、 注文ID 二重の役割を果たします - 挿入されたキーへの直接的な系譜と、 マージ...オン マッチ条件。

T-SQLにおける直接的な系譜と間接的な系譜

SQLFlowは区別します 直系の血統 (ソース列の値がターゲット列に格納される) 間接的な系統 (列は、 どこ 句、 参加する また マージオン 状態、 グループ分け、または集計)。この2つは図で個別に切り替えることができます。これは、ロードプロシージャにはバッチ日付、ステータスフラグ、ウォーターマーク列など、出力には表示されないものの到着するデータを暗黙的に制御するフィルタ列が多数あるため、T-SQL 作業では他のほとんどの方言よりも重要になります。ほとんどのリネージツールはこの区別をまったくモデル化していません。ロードプロシージャの影響分析では、多くの場合、問題となるのは後者です。

SQL Serverの系統情報の取得:入力と展開

SQL Server コードを SQLFlow に渡す方法は、環境のセキュリティレベルに応じていくつかあります。

入力仕組み良い
T-SQLを貼り付けるかアップロードしてくださいスクリプト、DDL、およびプロシージャ定義をファイルまたは貼り付けたテキストとして迅速な分析、コードレビュー、一度に1つの手順
JDBC経由のライブメタデータSQLFlowはインスタンスからDDL、ビュー、プロシージャ定義を取得します常に最新の状態に保たれるデータベース全体の系統情報
Grabitメタデータ抽出オフライン抽出ユーティリティはメタデータをSQLFlowに送信しますLineageサーバーがデータベースにアクセスできない環境

いずれの場合も分析は静的です。SQLFlow は SQL コードとスキーマ メタデータを読み取りますが、テーブルの行を読み取ることはありません。規制環境の場合、 SQLFlow オンプレミス 必要に応じてエアギャップ環境下で、ネットワーク内のDockerまたはKubernetes上で動作するため、T-SQLソースがインフラストラクチャから外部に出ることはありません。エンタープライズ展開では、100以上のデータベースと100万以上の列からなる環境を増分スキャンでバッチスキャンし、データリネージをDataHub、Microsoft Purview、およびOpenMetadataにエクスポートするため、SQL Serverのデータリネージを既に運用中のカタログに取り込むことができます。 価格クラウド版は無料(プレミアム版は月額$49.99)から。オンプレミス版は月額$500、またはデータベースタイプごとに1回限りの$4,800。詳細は 価格ページ.

オープンソースのパーサーやカタログプラットフォームについてはどうでしょうか?

オープンソースライブラリ SQL Lineagesqlglot 個々のクエリはうまく解析され、単純な SELECT および INSERT ステートメントにはそれで十分かもしれません。T-SQL プロシージャ コードではギャップが生じます。制御フローを持つプロシージャ本体、 #temp テーブルの状態はステートメント間でも変わりません。 マージ 分岐解析や動的SQL解決は、汎用ツールでは省略される高度なパーサーエンジニアリングです。カタログファーストのプラットフォームは、複数のシステムにわたるメタデータの整理に優れていますが、ストアドプロシージャロジックによる列の系統追跡には、通常、基盤となる解析エンジンが必要です。SQLFlowは、スタンドアロンとして、あるいはこれらのプラットフォームへの系統追跡フィードとして、まさにその役割を果たします。最も確実なテスト方法は、最も長い本番環境のプロシージャを各候補ツールで実行してみることです。

関連する系譜ガイド

よくある質問

SQLFlowは、SQL Serverの動的SQLを通じてデータの流れを追跡できますか?

はい。SQL は文字列変数に組み立てられ、実行されました。 sp_executesql また エグゼクティブ 動的SQLはプロシージャ解析内で解決および解析されるため、関連するテーブルと列がリネージグラフに表示されます。カタログベースの依存関係ビューでは、動的SQLは一切表示されません。

SQLFlowは#tempテーブルとテーブル変数に対応していますか?

はい。列は以下を通じて追跡されます。 #temp テーブルとテーブル変数をステートメント間で共有するため、データをステージングするパイプラインでは tempdb ソーステーブルから最終ターゲットまで、連続した1つの列レベルのパスとして表示されます。

これはSSMSの「依存関係の表示」とどう違うのですか?

SSMS の依存関係ビューはオブジェクトレベルの参照を報告します: プロシージャ A はテーブル B を参照しています。SQLFlow は T-SQL 本体を解析し、どのソース列がどのターゲット列にフィードするか、どの変換を介して (一時テーブルを介したフローを含む) 方向付きの列レベルのデータフローを報告します。 マージカタログが追跡しない動的SQLも含まれます。

SQLFlowは私のSQL Serverデータへのアクセスを必要としますか?

いいえ。SQLFlowはSQLコードの静的解析を実行し、必要に応じてテーブルやプロシージャ定義などのスキーマメタデータを読み取ります。テーブルの行データを読み取ることは決してなく、オンプレミス版ではSQLテキストはネットワーク内に保持されます。

どのストアドプロシージャがどのストアドプロシージャを呼び出しているかを確認できますか?

はい。SQLFlowは、プロシージャ間の呼び出しを示すインタラクティブな呼び出しグラフを列の系統図と並べて表示するので、複数のプロシージャからなるETLチェーンを最初から最後までナビゲートできます。

SQL Serverの系統追跡機能を無料で試用する方法はありますか?

はい。 SQLFlow クラウド 無料プランがあり、ブラウザにT-SQLを貼り付けるだけで、列レベルの系統図を取得できます。プレミアムプランは月額$49.99で、より多くの入力データやAPIへのアクセスが可能です。

SQL Serverの系統図を今すぐ作成しましょう

最も複雑なストアドプロシージャを無料のビジュアライザーに貼り付けるか、SQL Server環境全体のスキャンについてご相談ください。