OracleとSQL Serverのスキーマの違いとは?両方を使って戸惑った点を元アプリSEが紹介

OracleとSQL Serverのスキーマの違いを比較する記事 業務システムの技術・製品

OracleとSQL Serverの両方を使っていると、「スキーマ」という同じ言葉が出てきます。

私も最初にOracleを使い、その後SQL Serverを扱うようになったとき、スキーマという言葉を見て「Oracleと同じようなものだろう」と考えていました。

ところが実際にSQL Serverを触ってみると、どうも考え方が合いません。

調べてみると、OracleとSQL Serverではスキーマとユーザーの関係が異なっていました。

この記事では、OracleとSQL Serverのスキーマの違いについて、現在の公式情報と、私が実際に両方を使って戸惑った経験を分けながら紹介します。

なお、ここではスキーマの基本的な考え方に絞ります。権限設計や認証、詳細なデータベース設計については扱いません。

Oracleではユーザーとスキーマが強く結びついている

Oracle公式ドキュメントでは、各データベースユーザーが同じ名前のスキーマを1つ所有すると説明されています。

たとえば、HRというユーザーがあれば、そのユーザーはHRスキーマを所有します。

テーブルなどのスキーマオブジェクトは、このスキーマの中に存在します。

そのためOracleを先に使っていた私は、「ユーザー」と「スキーマ」がかなり近いものとして理解していました。

Oracle公式「Database Objects」

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ではユーザーとスキーマが分離されており、私にとっては同じ用語でも製品によってユーザーとの関係や位置付けが違うと意識するきっかけになりました。

タイトルとURLをコピーしました