SQLステートメントでオブジェクトを参照する場合、OceanBaseデータベースはSQLステートメントのコンテキストを考慮し、ネームスペース内でそのオブジェクトを見つけてから、指定された操作を実行します。ネームスペース内で指定されたオブジェクトが見つからない場合はエラーが返されます。
ユーザーのスキーマオブジェクトの参照
本記事では、具体的な例を通じてOceanBaseデータベースがSQLステートメント内のオブジェクトの参照をどのように解析するかを説明します。
以下のSQLステートメントを実行して、departmentsという名前のテーブルに1行のデータを追加します:
INSERT INTO departments
VALUES (280, 'ENTERTAINMENT_CLERK', 206, 1700);
SQLステートメントのコンテキストに基づいて、departmentsはデータベース内において以下のいずれかである可能性があります:
自分のスキーマ内のテーブル
自分のスキーマ内のビュー
テーブルまたはビュー専用の同義語
公有同義語
OceanBaseデータベースはまず、参照対象のオブジェクトを自分のスキーマ内のネームスペースで解析しようとします。その後、そのスキーマ以外のネームスペースを検討します。この例では、OceanBaseデータベースの解析プロセスは以下のようになります:
OceanBaseデータベースはまず、参照対象のオブジェクトを自分のスキーマのネームスペース内で特定しようとします。もしオブジェクトが専用の同義語であれば、OceanBaseデータベースはその同義語が指すオブジェクトを見つけることができます。このオブジェクトは自分のスキーマ内にある場合もあれば、他のスキーマ内や別のデータベース内にある場合もあります。また、このオブジェクトが他の同義語である場合でも、OceanBaseデータベースはその同義語が指すオブジェクトを見つけることができます。
オブジェクトがネームスペース内で見つかった場合、OceanBaseデータベースはそのオブジェクトに対してSQLステートメントを実行しようとします。この例では、OceanBaseデータベースは
departmentsに1行のデータを追加しようとしています。もしこのオブジェクトのタイプがSQLステートメントで必要なタイプではない場合、OceanBaseデータベースはエラーを返します。この例では、departmentsはテーブル、ビュー、あるいはテーブルまたはビューに解決できる専用の同義語でなければなりません。もしdepartmentsがシーケンスであれば、OceanBaseデータベースはエラーを返します。この時点で、どのネームスペースでもオブジェクトが見つからない場合、OceanBaseデータベースは共有同義語を含むネームスペースを検索します。オブジェクトが共有同義語を含むネームスペースに存在する場合、OceanBaseデータベースはそのオブジェクトに対してSQLステートメントを実行しようとします。もしこのオブジェクトのタイプがSQLステートメントで必要なタイプではない場合、OceanBaseデータベースはエラーを返します。この例では、もし
departmentsがシーケンスを表す共有同義語であれば、OceanBaseデータベースはエラーを返します。
共有同義語が依存するテーブルやユーザー定義の型を含む場合、依存するオブジェクトと同じスキーマ内で同義語と同じ名前のオブジェクトを作成することはできません。
逆に、同義語が依存するテーブルやユーザー定義の型を持っていない場合、依存するオブジェクトと同じスキーマ内で同じ名前のオブジェクトを作成することができます。OceanBaseデータベースはすべての依存オブジェクトを無効にして、次回アクセス時に再検証を行います。
他のスキーマ内のオブジェクトの参照
参照したいオブジェクトが他のスキーマに属する場合、オブジェクト名の前に対応するスキーマ名を追加する必要があります。構文は以下のとおりです:
schema.object
以下の例は、hrという名前のスキーマ内でemployeesテーブルを削除する方法を示しています:
DROP TABLE hr.employees;