メタデータ参照とシステムビューの役割
SQL Serverでは、データベース内部の構造、セキュリティ設定、実行中のクエリ状態を把握するために sys スキーマが提供するシステムビューを参照します。これらのビューは、従来のレガシーテーブルよりも構造化されており、スキーマ設計の確認やパフォーマンスチューニングの基盤として不可欠です。
オブジェクト構成と列情報の取得
データベース内に存在するテーブル、ビュー、ストアドプロシージャなどのメタデータは sys.objects が一元管理しています。特定のテーブルの列構成を確認する際、データ型辞書である sys.types と結合すると、実運用で必要な詳細情報が取得できます。
SELECT
t.name AS tbl_identifier,
c.column_id,
c.name AS col_identifier,
ty.name AS base_data_type
FROM sys.tables AS t
INNER JOIN sys.columns AS c ON t.object_id = c.object_id
INNER JOIN sys.types AS ty ON c.user_type_id = ty.user_type_id
WHERE t.name = N'EmployeeMaster';
ユーザー定義テーブルのみをリスト化したい場合は、sys.tables を直接クエリします。作成日時や所属スキーマを併記することで、開発環境と本番環境の差分比較が容易になります。
SELECT object_id, name, schema_id, create_date, modify_date
FROM sys.tables
ORDER BY create_date DESC;
インデックス戦略と参照整合性
データ検索の高速化や重複防止に利用されるインデックスは sys.indexes で管理されます。クラスタードインデックス(type_desc: CLUSTERED)と非クラスタードインデックス(type_desc: NONCLUSTERED)を区別して抽出し、ストレージ使用量やフラグメント率と照らし合わせます。
SELECT i.object_id, i.name AS index_name, i.type_desc, i.is_primary_key, i.is_unique
FROM sys.indexes AS i
WHERE i.object_id = OBJECT_ID(N'dbo.OrderDetails')
AND i.type BETWEEN 1 AND 2;
テーブル間の参照整合性を保証する外部キー制約は sys.foreign_keys が保持します。親テーブルと子テーブルの依存関係を特定するには、制約名と参照先オブジェクトIDを組み合わせます。
SELECT
fk.name AS constraint_name,
OBJECT_NAME(fk.parent_object_id) AS referencing_table,
OBJECT_NAME(fk.referenced_object_id) AS referenced_table
FROM sys.foreign_keys AS fk;
セキュリティ主体と認証アカウント
データベースレベルのアクセス権限を付与する対象(ユーザー、データベースロール、アプリケーションロール)は sys.database_principals で追跡できます。認証タイプに応じて適切な権限モデルを設計する際の基準になります。
SELECT principal_id, name, type_desc, default_schema_name
FROM sys.database_principals
WHERE type IN ('S', 'R', 'A');
インスタンス全体のSQLログインアカウント情報は sys.sql_logins が保持します。無効化されているアカウントや最終変更日を監査する際に活用されます。
SELECT name, type_desc, is_disabled, is_policy_checked, create_date
FROM sys.sql_logins
ORDER BY create_date;
セッション監視と実行クエリの可視化
現在アクティブなクライアント接続を把握するには、動的管理ビュー(DMV)である sys.dm_exec_sessions を利用します。ユーザープロセスのみをフィルタリングし、ホスト名やプログラム情報から接続元を特定できます。
SELECT session_id, login_name, host_name, status, program_name, client_interface_name
FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND status = 'running';
セッション内で実際に実行中のバッチや命令の詳細は sys.dm_exec_requests で取得可能です。開始時刻や経過時間を抽出し、長時間実行されているトランザクションやブロッキングの原因を特定する標準的な手法です。
SELECT r.session_id, r.command, r.status, r.start_time, r.total_elapsed_time, r.wait_type
FROM sys.dm_exec_requests AS r
WHERE r.session_id > 50 AND r.command != 'AWAITING COMMAND';
レガシー互換ビューに関する注意点
旧バージョンのSQL Serverで広く利用されていた sys.sysobjects は、現在のエンジンアーキテクチャでは互換性維持のためのビューに過ぎません。新しいシステムビュー(sys.objects や sys.tables など)を正しく参照することで、将来のバージョンアップ時のクエリ改修リスクを排除し、安定したメタデータ抽出を保証できます。