OracleとSQL Serverの両方を使っていると、「スキーマ」という同じ言葉が出てきます。
私も最初にOracleを使い、その後SQL Serverを扱うようになったとき、スキーマという言葉を見て「Oracleと同じようなものだろう」と考えていました。
ところが実際にSQL Serverを触ってみると、どうも考え方が合いません。
調べてみると、OracleとSQL Serverではスキーマとユーザーの関係が異なっていました。
この記事では、OracleとSQL Serverのスキーマの違いについて、現在の公式情報と、私が実際に両方を使って戸惑った経験を分けながら紹介します。
なお、ここではスキーマの基本的な考え方に絞ります。権限設計や認証、詳細なデータベース設計については扱いません。
Oracleではユーザーとスキーマが強く結びついている
Oracle公式ドキュメントでは、各データベースユーザーが同じ名前のスキーマを1つ所有すると説明されています。
たとえば、HRというユーザーがあれば、そのユーザーはHRスキーマを所有します。
テーブルなどのスキーマオブジェクトは、このスキーマの中に存在します。
そのためOracleを先に使っていた私は、「ユーザー」と「スキーマ」がかなり近いものとして理解していました。
SQL Serverではユーザーとスキーマは別になっている
SQL Serverでは、Oracleと同じ考え方にはなりません。
Microsoftの公式ドキュメントでは、スキーマはデータベースオブジェクトをまとめる名前付きのコンテナーとして説明されています。
1つのデータベースユーザーと1つのスキーマが必ず1対1で対応するわけではありません。
複数のデータベースユーザーが同じスキーマを利用することもでき、1つのデータベースプリンシパルが複数のスキーマを所有することもできます。
Oracleを先に使っていた私にとっては、ここが最初にイメージしにくかった部分でした。
Microsoft Learn「Ownership and user-schema separation in SQL Server」
オブジェクト名の見え方にも違いがある
スキーマの違いは、データベースオブジェクトの名前を見るときにも意識する必要があります。
Oracleでは、別のスキーマにあるオブジェクトを指定するときに、
schema.object
という形で表すことがあります。
Oracle公式「Syntax for Schema Objects and Parts in SQL Statements」
一方、SQL Serverでは、
database.schema.object
という3つの要素を使った名前でオブジェクトを指定できます。
さらにリンクサーバーなどを含める場合は、
server.database.schema.object
という4部名も使えます。
SQL Serverでは、データベース、スキーマ、オブジェクトを分けて扱うため、Oracleとはオブジェクト名の見え方も異なります。
Microsoft Learn「Transact-SQL Syntax Conventions」
まとめ:同じ「スキーマ」でもOracleとSQL Serverでは考え方が違った
私はOracleを先に使っていたため、SQL Serverの「スキーマ」も同じようなものだと思っていました。
しかし実際には、Oracleではユーザーとスキーマが強く結びついている一方、SQL Serverではユーザーとスキーマが分離されており、私にとっては同じ用語でも製品によってユーザーとの関係や位置付けが違うと意識するきっかけになりました。

