データベース・オブジェクト名および修飾子

データベース・オブジェクトの中には、複数のコンポーネントから構成されていて、各コンポーネントに名前を付けることが可能または必須のものがあります(たとえば、表またはビュー内の列、索引および表のパーティションとサブパーティション、表の整合性制約、パッケージ内に格納されるオブジェクト(プロシージャやストアド・ファンクションなど))。この項の内容は、次のとおりです。

  • データベース・オブジェクトとデータベース・オブジェクトの位置修飾子のネーミング規則

  • データベース・オブジェクトと修飾子のネーミングのガイドライン

ノート:

Oracleでは、暗黙的に生成されるデータベース・オブジェクトとサブオブジェクトには「SYS_」で始まるシステム生成名を使用し、Oracleが提供する一部のオブジェクトには、「ORA_」で始まる名前を使用します。名前解決での競合を避けるため、これらの接頭辞は明示的に指定するデータベース・オブジェクト名やサブオブジェクト名では使用しないでください。

データベース・オブジェクトのネーミング規則

すべてのデータベース・オブジェクトには、名前があります。SQL文では、引用識別子または非引用識別子を使用して、オブジェクトの名前を表します。

  • 引用符付きの識別子は、先頭と末尾に二重引用符(")を付けます。引用符付きの識別子を使用してスキーマ・オブジェクトを命名した場合は、そのオブジェクトを参照するときに必ず二重引用符を使用する必要があります。

  • 引用符なしの識別子は記号で囲みません。

データベース・オブジェクトを指定する場合、引用識別子または非引用識別子を使用できます。データベース名、グローバル・データベース名、データベース・リンク名、ディスク・グループ名およびプラガブル・データベース(PDB)名では大/小文字は区別されませんが、大文字として保存されます。このような名前を引用識別子として指定する場合、引用符は特に警告もなく無視されます。

関連項目:

ユーザー名とパスワードのネーミング規則の詳細は、「CREATE USER」を参照してください。

ノート:

データベース・オブジェクト名には引用識別子を使用しないことをお薦めします。SQL*Plusではこのような引用識別子は許可されていますが、データベース・オブジェクトを管理する他のツールでは有効でない場合があります。

特に記載のある場合を除いて、次の規則が引用符付きと引用符なしの両方の識別子に適用されます。

  1. 識別子名の最大長は、COMPATIBLE初期化パラメータの値によって異なります。

    • COMPATIBLE が12.2以上の値に設定されている場合、次の例外を除いて、名前は1から128バイトの長さにする必要があります。

      • データベースの名前は、8バイトまでに制限されています。

      • ディスク・グループ、プラガブル・データベース(PDB)、ロールバック・セグメント、表領域および表領域セットの名前は、30バイトまでに制限されています。

      識別子にピリオドで区切られた複数の部分が含まれる場合、各属性の長さは最大128バイトにできます。セパレータのそれぞれのピリオド、および取り囲んでいる二重引用符は1バイトとしてカウントされます。たとえば、次のように列を識別するとします。

      "schema"."table"."column"
      

      スキーマ名、表名、列名の長さはそれぞれ128バイトです。各引用符やピリオドはシングルバイト文字のため、この例での識別子の総バイト長は、最大392バイトになります。

    • COMPATIBLE が12.2未満の値に設定されている場合、次の例外を除いて、名前は1から30バイトの長さにする必要があります。

      • データベースの名前は、8バイトまでに制限されています。

      • データベース・リンクの名前は、128バイトまで指定できます。

      識別子がピリオドで区切られた複数の部分から成る場合、各属性は30バイトまでの長さで指定できます。セパレータのそれぞれのピリオド、および取り囲んでいる二重引用符は1バイトとしてカウントされます。たとえば、次のように列を識別するとします。

      "schema"."table"."column"
      

      スキーマ名、表名、列名の長さはそれぞれ30バイトです。各引用符やピリオドはシングルバイト文字のため、この例での識別子の総バイト長は、最大98バイトになります。

  2. 非引用識別子にOracle SQLの予約語は使用できません。引用識別子には、予約語を使用できますが、お薦めしません。

    名前は、データベース・オブジェクトにアクセスするために使用するOracle製品固有のその他の予約語によって、さらに制限されることもあります。

    ノート:

    予約語ROWIDは、この規則の例外です。大文字のROWIDは、引用符の有無にかかわらず、列名としては使用できません。ただし、大文字の単語は列名以外の引用識別子として使用でき、小文字が含まれる単語(たとえば"Rowid"や"rowid")は、列名をはじめとする任意の引用識別子として使用できます。

    関連項目:

  3. OracleのSQL言語には、特別な意味を持つ文字が含まれています。これらの文字には、データ型、スキーマ名、ファンクション名、ダミーのシステム表DUALおよびキーワード(DIMENSIONSEGMENTALLOCATEDISABLEなど、SQL文中の大文字の単語)が含まれます。これらの文字は予約語ではありません。ただし、Oracleは固有の方法でこれらの文字を内部的に使用します。したがって、これらの文字をオブジェクトおよびオブジェクトの部分の名前として使用した場合、使用しているSQL文が読みにくくなり、予期しない結果になることがあります。

    特に、SYS_またはORA_で始まる文字をスキーマ・オブジェクト名として使用しないでください。また、SQL組込みファンクションの名前を、スキーマ・オブジェクトまたはユーザー定義ファンクションの名前として使用しないでください。

    関連項目:

  4. 異なるプラットフォームおよびオペレーティング・システム間では、ASCIIレパートリからの文字を使用することで最適な互換性を得ることができます。データベース名、グローバル・データベース名、データベース・リンク名には、これらの文字を使用してください。マルチテナント・コンテナ・データベース(CDB)内の共通ユーザーと共通ロールの名前には、ASCIIレパートリにある文字のみを使用してください。

  5. パスワードにマルチバイト文字を含めることができます。

  6. 引用符なしの識別子は、データベース文字セットのアルファベット文字で開始する必要があります。引用符付きの識別子は任意の文字で開始できます。

  7. 引用符で囲まれていない識別子には、データベースの文字セットの英数字とアンダースコア(_)のみを使用できます。データベース・リンクの名前には、ピリオド(.)とアットマーク(@)を使用できます。

    引用識別子には、すべての文字、句読点および空白を使用できます。ただし、二重引用符またはnull文字(\0)は、引用符付きまたは引用符なしのどちらの識別子にも使用できません。

  8. ネームスペース内では、2つのオブジェクトに同じ名前を付けることはできません。

    次のスキーマ・オブジェクトは、1つのネームスペースを共有します。

    • パッケージ

    • プライベート・シノニム

    • 順序

    • スタンドアロン・プロシージャ

    • スタンドアロン・ストアド・ファンクション

    • ユーザー定義演算子

    • ユーザー定義型

    • ビュー

    次の各スキーマ・オブジェクトは、固有のネームスペースを持ちます。

    • クラスタ

    • 制約

    • データベース・トリガー

    • ディメンション

    • 索引

    • マテリアライズド・ビュー(マテリアライズド・ビューを作成すると、データベースで同じ名前の内部表が作成されます。この表は、スキーマ内の他の表と同じネームスペースを持ちます。このため、スキーマに同じ名前の表とマテリアライズド・ビューを含めることはできません。)

    • プライベート・データベース・リンク

    表および順序が同じネームスペースにあるため、同じスキーマの表および順序が同じ名前を持つことはできません。ただし、表と索引は異なるネームスペースに存在します。このため、同じスキーマ内の表と索引には、同じ名前を付けることができます。

    データベース内の各スキーマには、その中のオブジェクトのために固有のネームスペースがあります。たとえば、異なるスキーマ内の2つの表は異なるネームスペースに存在し、同じ名前を付けることができます。

    次の各非スキーマ・オブジェクトは、固有のネームスペースを持ちます。

    • エディション

    • パラメータ・ファイル(PFILE)およびサーバー・パラメータ・ファイル(SPFILE)

    • プロファイル

    • パブリック・データベース・リンク

    • パブリック・シノニム

    • 表領域

    • ユーザー・ロール

    これらのネームスペース内のオブジェクトはスキーマに含まれないため、これらのネームスペースはデータベース全体で使用されます。

  9. 引用符なしの識別子では大文字と小文字が区別されません。引用符のない識別子は大文字として解析されます。引用符付きの識別子では大文字と小文字が区別されます。

    二重引用符で名前を囲むことによって、次の名前を同じネームスペースの異なるオブジェクトに割り当てることができます。

    "employees"
    "Employees"
    "EMPLOYEES"
    

    ただし、Oracleは次の名前を同じ名前として解析するため、同じネームスペース内の異なるオブジェクトには、次の名前を使用できません。

    employees
    EMPLOYEES
    "EMPLOYEES"
    
  10. Oracleが識別子を大文字で格納または比較する場合、識別子の各文字の大文字形式は、データベース文字セットの大文字化規則を適用することによって決定されます。セッション設定NLS_SORTによって決定される言語固有の規則は考慮されません。この動作は、ファンクションNLS_UPPERではなく、SQLファンクションUPPERを識別子に適用することに対応しています。

    データベース文字セットの大文字化規則によって、特定の自然言語としては不適切な結果となる場合があります。たとえば、データベース文字セットの大文字化規則に従うと、ドイツ語で使用される小文字のシャープs("ß")に大文字形式はありません。この文字は、識別子が大文字に変換されても変更されませんが、期待されるドイツ語での大文字形式は、2つの大文字のSの連続("SS")です。同様に、小文字iの大文字形式は、データベース文字セットの大文字化規則に従うと大文字Iです。ただし、トルコ語およびアゼルバイジャン語で予期される大文字形式は、上に点が付いた大文字Iです。

    データベース文字セットの大文字化規則では、識別子はセッションのすべての言語構成で同様に解釈されます。識別子が特定の自然言語で正しく表示されるようにする場合は、引用符で囲んで小文字形式を保持するか、またはその識別子を使用するときは常に言語的に正しい大文字形式を使用することができます。

  11. 同じ表やビューでは、複数の列に同じ名前を付けることはできません。ただし、異なる表やビューでは、複数の列に同じ名前を付けることができます。

  12. 引数の数およびデータ型が異なる場合、同じパッケージに含まれるプロシージャやファンクションに同じ名前を付けることができます。異なる引数を持ち、同じ名前のプロシージャやファンクションを同じパッケージ内に複数作成することを、オーバーロードといいます。

  13. 表領域名は、30バイトに制限されている他の識別子とは異なり、大/小文字が区別されます。

スキーマ・オブジェクトのネーミング例

次に、有効なスキーマ・オブジェクト名の例を示します。

last_name
horse
hr.hire_date
"EVEN THIS & THAT!"
a_very_long_and_valid_name

これらのすべての例は、データベース・オブジェクトのネーミング規則に示す規則に従っています。

スキーマ・オブジェクトのネーミングのガイドライン

次に、オブジェクトおよび各部分の命名に役立つガイドラインを示します。

  • 完全な、わかりやすい、発音可能な名前(またはよく知られた略語)を使用します。

  • 一貫性のあるネーミング・ルールを使用します。

  • 複数の表にまたがる同一のエンティティや属性を記述するためには、同一の名前を使用します。

オブジェクトに名前を付けるときは、名前を短く、使いやすくするという目標と、できるだけわかりやすい名前にするという目標のバランスをとる必要があります。迷ったときは、よりわかりやすい名前を選んでください(データベース内のオブジェクトは、長年の間に多数の人に使用される可能性があるため)。表の列に、payment_due_dateではなくpmddのような名前を付けると、10年後のデータベース管理者が見たときに理解できない可能性があります。

一貫したネーミング規則を使用すると、アプリケーション上の各表の働きが理解しやすくなります。そのような規則の例として、FINANCEアプリケーションに属している表の名前をすべてfin_で始めるような場合が考えられます。

同一のエンティティや属性に対しては、複数の表にまたがっていても同じ名前を使用してください。たとえば、employeesサンプル表とdepartmentsサンプル表の部門番号列には、どちらにもdepartment_idという名前を付けます。