LDIFファイルのトラブルシューティング

Novellインポート/エクスポート変換ユーティリティを使用すると、eDirectoryとの間でのLDIFファイルのインポートおよびエクスポートが簡単になります。詳細については、「Novellインポート/エクスポート変換ユーティリティ」を参照してください。

LDIFインポートを正しく機能させるには、Novellインポート/エクスポート変換ユーティリティが読み込み、および処理できるLDIFファイルを最初に作成する必要があります。このセクションでは、LDIFファイル形式および構文について説明し、正しいLDIFファイルの例を示します。


LDIFについて

LDIFは、広く一般的に使用されているファイル形式で、ディレクトリ情報およびディレクトリで実行可能な変更操作について記述します。LDIFは、実際のディレクトリ内で使用されている記憶フォーマットとは完全に独立していて、通常は、LDAPサーバとの間でディレクトリ情報をエクスポートまたはインポートするために使用します。

一般的に、LDIFは簡単に生成できます。そのため、awkやperlなどのツールを使用して、固有の形式のデータをLDAPディレクトリに移動できます。また、LDIF形式でテストデータを生成するスクリプトを作成することもできます。


LDIFファイル形式

Novellインポート/エクスポート変換ユーティリティでインポートするファイルは、LDIF 1形式である必要があります。次に、LDIF 1のファイルの基本ルールを示します。


LDIF内容レコード

LDIF内容レコードは、エントリ全体の内容を表します。次に、4つの内容レコードが定義されたLDIFファイルの例を示します。

 1  version:1
 2  dn:c=US
 3  objectClass:top
 4  objectClass:country
 5  
 6  dn:l=San Francisco, c=US
 7  objectClass:top
 8  objectClass:locality
 9  st:San Francisco
10
11 dn:ou=Artists, l=San Francisco, c=US
12 objectClass:top
13 objectClass:organizationalUnit
14 telephoneNumber:+1 415 555 0000
15 
16 dn:cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
17 sn:Michaels
18 givenname:Peter
19 objectClass:top
20 objectClass:person
21 objectClass:organizationalPerson
22 objectClass:iNetOrgPerson
23 telephonenumber:+1 415 555 0001
24 mail:Peter.Michaels@aaa.com
25 userpassword:Peter123
26

このLDIFファイルは、次の部分から構成されています。


表 135. LDIFファイルコンポーネント

パート 説明

バージョン指定子

LDIFファイルの第1行目にはバージョンが記述されます。コロンとバージョン番号(現在は1と定義します)の間には、1つ以上のスペースを指定できますが、スペースを指定しなくても問題はありません。

バージョンを指定した行がない場合、LDIFファイルを処理するアプリケーションはそのファイルのバージョンを0とみなすことができます。また、構文エラーとしてLDIFファイルが拒否される可能性もあります。LDIFを処理するNovellのユーティリティは、バージョンを指定する行がない場合、ファイルのバージョンを0とみなします。

識別名指定子

各内容レコードの先頭の行(この例では、2、6、11、および16行目)には、そのレコードが表すエントリのDN(識別名)を指定します。

DN指定子は、次の2つのどちらかの形式をとる必要があります。

  • dn:safe_UTF-8_distinguished_name
  • dn::Base64_encoded_distinguished_name

行区切り記号

行区切り記号としては、改行、またはキャリッジリターンと改行の組み合わせのどちらかを使用できます。これにより、行区切りとして改行を使用するLinux*およびSolaris*テキストファイルと、キャリッジリターンと改行の組み合わせを使用するMS-DOSおよびWindows*テキストファイルとの間の非互換性を解決できます。

レコード区切り記号

レコード区切りとしては、空白行(この例では5、10、15および26行目)を使用します。

LDIFファイル内の各レコード(最後のレコードも含む)の終わりには、レコード区切り記号として1行以上の空白行を挿入する必要があります。一部のアプリケーションでは、レコード区切りを指定していないLDIFファイルもそのまま受け入れられますが、LDIFの仕様ではレコード区切りは必須です。

属性値指定子

内容レコード内のその他すべての行は、値指定子です。値指定子は、次の3つのいずれかの形式をとる必要があります。

  • 属性の記述:value
  • 属性の記述::Base64_encoded_value
  • 属性の記述:URL


LDIF変更レコード

LDIF変更レコードには、ディレクトリに対して行う変更が記述されます。LDAPの更新操作(追加、削除、変更、およびDNの変更)はすべて、LDIF変更レコードに記述できます。

LDIF変更レコードでは、LDIF内容レコードと同じ形式の識別名指定子、属性値指定子、およびレコード区切り記号を使用します(詳細については、「LDIF内容レコード」を参照してください)。LDIF内容レコードとの違いは、LDIF変更レコードにはchangetypeフィールドがあることです。changetypeフィールドは、変更レコードが指定する操作を識別します。

changetypeフィールドは、次の5つのいずれかの形式をとる必要があります。


表 136. changetypeフィールドの形式

変更タイプ 説明

changetype: add

この変更レコードがLDAPの追加操作を指定することを示すキーワード。

changetype: delete

この変更レコードがLDAPの削除操作を指定することを示すキーワード。

changetype: moddn

この変更レコードが、LDIFプロセッサがバージョン3クライアントとしてLDAPサーバにバインドされている場合はLDAPのDN変更操作を、バージョン2クライアントとしてLDAPサーバにバインドされている場合はRDN変更操作を指定することを示すキーワード。

changetype: modrdn

moddn変更タイプと同義です。

changetype: modify

この変更レコードがLDAPの変更操作を指定することを示すキーワード。


「追加」変更タイプ

追加変更レコードは、内容変更レコード(「LDIF内容レコード」を参照)に、changetype: addフィールドを属性値フィールドの直前に追加したものと同じです。

すべてのレコードでタイプが一致している必要があります。内容レコードと変更レコードを混在させることはできません。

 1 version:1
 2 dn:c=US
 3 changetype:add
 4 objectClass:top
 5 objectClass:country
 6 
 7 dn:l=San Francisco, c=US
 8 changetype:add
 9 objectClass:top
10 objectClass:locality
11 st:San Francisco
12
14 dn:ou=Artists, l=San Francisco, c=US
15 changetype:add
16 objectClass:top
17 objectClass:organizationalUnit
18 telephoneNumber:+1 415 555 0000
19 
20 dn:cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
21 changetype:add
22 sn:Michaels
23 givenname:Peter
24 objectClass:top
25 objectClass:person
26 objectClass:organizationalPerson
27 objectClass:iNetOrgPerson
28 telephonenumber:+1 415 555 0001
29 mail:Peter.Michaels@aaa.com
30 userpassword:Peter123
31


「削除」変更タイプ

削除変更レコードはエントリの削除を指定するので、削除変更レコードに必要なフィールドは識別名指定子と「削除」変更タイプだけです。

次に、「追加」変更タイプのLDIFファイルで作成した4つのエントリを削除するLDIFファイルの例を示します。

重要:  以前に追加したエントリを削除するには、エントリの指定順序を逆にする必要があります。順序を逆にしないと、コンテナ内のエントリが空でないため削除操作が失敗します。

 1 version:1
 2 dn:cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 3 changetype:delete
 4
 5 dn:ou=Artists, l=San Francisco, c=US
 8 changetype:delete
 9
10 dn:l=San Francisco, c=US
11 changetype:delete
12
13 dn:c=US
14 changetype:delete
15


「変更」変更タイプ

「変更」変更タイプでは、すでに存在するエントリに対して属性値の追加、削除、および置換を指定できます。変更指定子は、次の3つのいずれかの形式をとる必要があります。


表 137. 変更指定子要素

変更指定子要素 説明

add: 属性タイプ

この属性タイプに対する後続の属性値指定子をエントリへ追加するように指定するキーワード。

delete: 属性タイプ

この属性タイプの値を削除することを指定するキーワード。deleteフィールドの後に属性値指定子が続く場合は、その指定された値が削除されます。

deleteフィールドの後に属性値指定子がない場合は、すべての値が削除されます。属性に値がない場合、この操作は失敗しますが、属性には削除する値がないので結果的にはこの操作が成功したときと同じです。

replace: 属性タイプ

属性タイプの値を置き換えることを指定するキーワード。replaceフィールドに続く属性値指定子が、その属性タイプの新しい値になります。

replaceフィールドの後に属性値指定子がない場合は、現在の値のセットが空の値のセットに置き換えられます(結果的に、属性が削除されます)。delete変更指定子とは異なり、属性に値が設定されていない場合でもreplaceは成功します。両方の場合とも実際の結果は同じです。

次の「変更」変更タイプの例では、cn=Peter Michaelsエントリに別の電話番号を追加します。

 1 version:1
 2 dn:cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 3 changetype:modify
 4 # add the telephone number to cn=Peter Michaels
 4 add:telephonenumber
 5 telephonenumber: +1 415 555 0002
 6

1つのLDAP変更要求にさまざまな変更を組み合わせて指定できるのと同じように、1つのLDIFレコードに複数の変更指定子を指定できます。ハイフン(-)だけが記述されている行は、各変更指定子に対する属性値指定の終わりを示します。

次のLDIFファイルの例では、さまざまな変更指定子が使用されています。

 1 version: 1
 2
 3 # An empty line to demonstrate that one or more
 4 # line separators between the version identifier 
 5 # and the first record is legal.
 6
 7 dn: cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 8 changetype: modify
 9 # Add an additional telephone number value.
10 add: telephonenumber
11 telephonenumber: +1 415 555 0002
12 -
13 # Delete the entire fascimiletelephonenumber attribute.
14 delete: facsimileTelephoneNumber
15 -
16 # Replace the existing description (if any exists) 
17 # with two new values.
18 replace: description
19 description: guitar player
20 description: solo performer
21 -
22 # Delete a specific value from the telephonenumber 
23 # attribute.
24 delete: telephonenumber
25 telephonenumber: +1 415 555 0001
26 -
27 # Replace the existing title attribute with an empty 
28 # set of values, thereby causing the title attribute to 
29 # be removed.
30 replace: title
31 -
32


「DN変更」変更タイプ

「DN変更」変更タイプでは、エントリのリネーム、移動、またはその両方ができます。この変更タイプは、2つの必須フィールドと1つのオプションフィールドで構成されます。


表 138. 「DN変更」変更タイプのフィールド

フィールド 説明

newrdn (必須)

このレコードの処理時にエントリに割り当てる新しい名前を指定します。新規RDN(newrdn)指定子は、次の2つのどちらかの形式をとる必要があります。

  • newrdn: safe_UTF-8_relative_distinguished_name
  • newrdn:: Base64_encoded_relative_ distinguished_name

新規RDN指定子は、「DN変更」変更タイプが指定されたすべてのLDIFレコードで必須です。

deleteoldrdn (必須)

旧RDN削除(deleteoldrdn)指定子は、古いRDNをnewrdn(新規RDN)に置き換えるか、残しておくかを指定するフラグです。これは、次の2つのどちらかの形式をとります。

  • deleteoldrdn: 0

    リネーム後も古いRDNの値をエントリ内に残しておくことを指定します。

  • deleteoldrdn: 1

    エントリのリネーム後に古いRDNの値を削除することを指定します。

newsuperior (オプション)

新規スーペリア(newsuperior)指定子は、このDN変更レコードの処理時にエントリに割り当てる新しいペアレントの名前を指定します。新規スーペリア指定子は、次の2つのどちらかの形式をとります。

  • newsuperior:safe_UTF-8_distinguished_name
  • newsuperior::Base64_encoded_distinguished_ name

新規スーペリア指定子は、「DN変更」変更タイプが指定されたLDIFレコードでオプションとして使用できます。これは、エントリのペアレントを変更する場合のみ指定します。

次の「DN変更」変更タイプの例で、エントリのリネーム方法を示します。

 1 version:1
 2 
 3 # Rename ou=Artists to ou=West Coast Artists, and leave
 4 # its old RDN value.
 5 dn:ou=Artists,l=San Francisco,c=US
 6 changetype:moddn
 7 newrdn:ou=West Coast Artists
 8 deleteoldrdn: 1
 9

次の「DN変更」変更タイプの例で、エントリの移動方法を示します。

 1 version:1
 2
 3 # Move cn=Peter Michaels from 
 4 # ou=Artists,l=San Francisco,c=US to 
 5 # ou=Promotion,l=New York,c=US and delete the old RDN.
 5 dn:cn=Peter Michaels,ou=Artists,l=San Francisco,c=US
 6 changetype:moddn
 7 newrdn:cn=Peter Michaels
 8 deleteoldrdn:1
 9 newsuperior:ou=Promotion,l=New York,c=US
10

次の「DN変更」変更タイプの例では、エントリを移動し、同時にリネームする方法を示します。

 1 version:1
 2
 3 # Move ou=Promotion from l=New York,c=US to
 4 # l=San Francisco,c=US and rename it to 
 5 # ou=National Promotion.
 5 dn:ou=Promotion,l=New York,c=US
 6 changetype:moddn
 7 newrdn:ou=National Promotion
 8 deleteoldrdn:1
 9 newsuperior:l=San Francisco,c=US
10

重要:  LDAP 2のRDN変更操作では、エントリの移動はサポートされません。LDAP 2クライアントでLDIF newsuperior構文を使用してエントリを移動しようとすると、その要求は失敗します。


LDIFファイル内での行の折り返し

LDIFファイル内で行を折り返すには、行を折り返したい場所で単に行区切り記号(改行、またはキャリッジリターンと改行の組み合わせ)を挿入し、その後にスペースを追加します。LDIFパーサは、行の先頭にスペースを見つけると、その行の残りのデータと前の行のデータを結合して解析します。そのため、先頭のスペースは無視されます。

マルチバイトのUTF-8文字の途中では、行を折り返さないでください。

次に、行の折り返しを含む(13および14行目)LDIFファイルの例を示します。

 1 version:1
 2 dn:cn=Peter Michaels, ou=Artists, l=San Francisco, c=US
 3 sn:Michaels
 4 givenname:Peter
 5 objectClass:top
 6 objectClass:person
 7 objectClass:organizationalPerson
 8 objectClass:iNetOrgPerson
 9 telephonenumber:+1 415 555 0001
10 mail:Peter.Michaels@aaa.com
11 userpassword:Peter123
12 description:Peter is one of the most popular music
13  ians recording on our label.He's a big concert dr
14  aw, and his fans adore him.
15


LDIFファイルをデバッグする

LDIFファイルで問題が発生した場合、次のことを考慮してください。


前方参照を有効化する

LDIFファイルで、あるエントリを追加するレコードを、そのエントリのペアレントを追加するレコードの前に記述してしまう場合があります。この場合、LDAPサーバが新しいエントリを追加しようとするときに、そのエントリのペアレントが存在しないためエラーが生成されます。

この問題は、単に前方参照の使用を有効にするだけで解決できます。前方参照の作成を有効にすると、エントリを作成するときにそのペアレントがまだ存在していない場合でも、このペアレント用に前方参照というプレースホルダが作成されるため、エントリを正常に作成できます。後の操作でペアレントが作成されると、前方参照は通常のエントリに変更されます。

LDIFのインポートが完了した後でも、1つ以上の前方参照が残っている場合もあります(たとえば、LDIFファイルでエントリのペアレントが作成されなかった場合など)。この場合、前方参照はConsoleOneTMに不明オブジェクトとして表示されます。前方参照エントリは検索できますが、前方参照エントリには属性も属性値もないため、(objectClass以外の)属性を読み込むことはできません。ただし、前方参照の下に位置する実オブジェクトエントリ上では、すべてのLDAP操作が正常に機能します。


前方参照エントリを識別する

前方参照エントリは「不明」のオブジェクトクラスを持ち、また、内部NDS EF_REFERENCEエントリにフラグが設定されています。ConsoleOneでは、「不明」のオブジェクトクラスを持つエントリは、中央に疑問符が表示される丸い黄色いアイコンで示されます。LDAPでも不明オブジェクトクラスのオブジェクトを検索できますが、現在のところ、LDAPからエントリフラグの設定にアクセスしてそれが前方参照エントリであることを確認する方法はありません。


前方参照エントリを通常オブジェクトへ変更する

前方参照エントリは、単にオブジェクトを作成すれば、通常のオブジェクトに変更できます(LDIFファイルまたはLDAPクライアント要求などを使用して作成します)。前方参照としてすでに存在するエントリを作成するようにeDirectoryで指定すると、eDirectoryは既存の前方参照エントリを、作成するように指定したオブジェクトに変換します。


Novell eDirectoryインポート/エクスポートウィザードを使用する

LDIFのインポート時に前方参照を有効にするには、次を実行します。

  1. ConsoleOneで、[ウィザード]>[NDSインポート/エクスポート]の順に選択します。

  2. [LDIFファイルをインポートする]>[次へ]の順にクリックします。

  3. インポートするデータを含むLDIFファイルの名前を入力し、[次へ]をクリックします。

  4. データをインポートするLDAPサーバを選択します。

  5. [詳細]>[前方参照を許可]>[閉じる]の順にクリックします。

  6. [次へ]>[終了]の順にクリックし、LDIFのインポートを開始します。

データをデータサーバへ移行するときに前方参照を有効にするには、次を実行します。

  1. ConsoleOneで、[ウィザード]>[NDSインポート/エクスポート]の順に選択します。

  2. [LDAPサーバ間でデータを移行]>[次へ]の順にクリックします。

  3. 移行するエントリを保持するLDAPサーバを選択し、[次へ]をクリックします。

  4. 移行するエントリの検索基準を指定し、[次へ]をクリックします。

  5. データを移行するLDAPサーバを選択します。

  6. [詳細]>[前方参照を許可]>[閉じる]の順にクリックします。

  7. [次へ]>[終了]の順にをクリックします。


Novellインポート/エクスポート変換ユーティリティのコマンドラインインタフェースを使用する

コマンドラインインタフェースで前方参照を有効にするには、-F LDAPターゲットハンドラオプションを使用します。

詳細については、「LDIFターゲットハンドラのオプション」を参照してください。


LDIFファイルの構文をチェックする

ファイル内のレコードを処理する前に、[操作を表示するが実行しない]LDIFソースハンドラオプションを使用してLDIFファイルの構文をチェックできます。

LDIFソースハンドラは、LDIFファイル内のレコードを処理するときに常に構文をチェックします。このオプションを使用すると、レコードの処理を無効にして、構文を検証できます。


Novell eDirectoryインポート/エクスポートウィザードを使用する

LDIFのインポート時に構文をチェックするには、次を実行します。

  1. ConsoleOneで、[ウィザード]>[NDSインポート/エクスポート]の順に選択します。

  2. [LDIFファイルをインポートする]>[次へ]の順にクリックします。

  3. インポートするデータを含むLDIFファイルの名前を入力し、[詳細]をクリックします。

  4. [操作を表示するが実行しない]>[閉じる]>[次へ]の順にクリックします。

  5. データをインポートするLDAPサーバを選択します。

  6. [次へ]>[終了]の順にクリックし、LDIFのインポートを開始します。


Novellインポート/エクスポート変換ユーティリティのコマンドラインインタフェースを使用する

コマンドラインインタフェースでLDIFファイルの構文をチェックするには、-n LDIFソースハンドラオプションを使用します。

詳細については、「LDIFソースハンドラのオプション」を参照してください。


LDIFエラーファイルを使用する

Novellインポート/エクスポート変換ユーティリティは、ターゲットハンドラによる処理に失敗したレコードをすべてリストしたLDIFファイルを自動的に作成します。ユーティリティによって生成されたLDIFエラーファイルを編集してエラーを修正し、サーバに再適用することで、失敗したレコードに含まれているインポートまたはデータの移行を完了できます。


Novell eDirectoryインポート/エクスポートウィザードを使用する
  1. ConsoleOneで、[ウィザード]>[NDSインポート/エクスポート]の順に選択します。

  2. 実行するタスクをクリックします。

  3. [詳細]をクリックします。

  4. [ログファイル]フィールドに、出力メッセージ(エラーメッセージを含む)を記録するファイル名を指定します。

  5. [失敗したレコードのLDIF出力ファイル]フィールドに、失敗したエントリをLDIF形式で出力するファイル名を指定します。

    このファイルを使用して、エラーを検査または修正できます。また、修正したファイルをディレクトリに再適用することもできます。

  6. [閉じる]をクリックします。

  7. 表示される指示に従って、選択したタスクを完了します。


Novellインポート/エクスポート変換ユーティリティのコマンドラインインタフェースを使用する

コマンドラインユーティリティでエラーログオプションを設定するには、-l一般オプションを使用します。

詳細については、「一般オプション」を参照してください。


LDAP SDKデバッギングフラグを使用する

一部のLDIFの問題を理解するには、LDAPクライアントSDKがどのように機能するかを理解する必要があります。LDAPソースハンドラ、LDAPターゲットハンドラ、またはその両方に、次のデバッギングフラグを設定できます。


表 139. LDAP SDKデバッギングフラグ

説明

0x0001

LDAPファンクションコールをトレースします。

0x0002

パケットに関する情報を印刷します。

0x0004

引数に関する情報を印刷します。

0x0008

接続情報を印刷します。

0x0010

BERのエンコーディングおよびデコーディング情報を印刷します。

0x0020

検索フィルタ情報を印刷します。

0x0040

設定情報を印刷します。

0x0080

ACL情報を印刷します。

0x0100

統計情報を印刷します。

0x0200

追加の統計情報を印刷します。

0x0400

シェル情報を印刷します。

0x0800

解析情報を印刷します。

0xFFFF (10進数では、-1)

すべてのデバッギングオプションを有効にします。

この機能を有効にするには、LDAPソースハンドラおよびターゲットハンドラで-eオプションを使用します。-eオプションに指定する整数の値は、LDAP SDKでさまざまな種類のデバッグ情報を有効にするビットマスクです。

詳細については、「LDAPソースハンドラのオプション」および「LDAPターゲットハンドラのオプション」を参照してください。


LDIFを使用してスキーマを拡張する

LDIFではLDAP更新操作を表すことができるので、LDIFを使用してスキーマを変更できます。


新しいオブジェクトクラスを追加する

クラスを追加するには、単に、NDSObjectClassDescriptionの仕様に従った属性値をsubschemaSubentryのobjectClasses属性に追加します。

NDSObjectClassDescription = "(" whsp
   numericoid whsp
   [ "NAME" qdescrs ]
   [ "DESC" qdstring ]
   [ "OBSOLETE" whsp ]
   [ "SUP" oids ] 
   [ ( "ABSTRACT" / "STRUCTURAL" / "AUXILIARY" ) whsp ]
   [ "MUST" oids ]    
   [ "MAY" oids ]     
   [ "X-NDS_NOT_CONTAINER" qdstrings ]
   [ "X-NDS_NONREMOVABLE" qdstrings ]
   [ "X-NDS_CONTAINMENT" qdstrings ] 
   [ "X-NDS_NAMING" qdstrings ]
   [ "X-NDS_NAME" qdstrings ] 
   whsp ")"

次の例のLDIFファイルでは、person objectClassをスキーマに追加します。

 1 version:1
 2 dn:cn=schema
 3 changetype:add
 4 objectClasses:( 2.5.6.6 NAME 'person' DESC 'Standard
 5   ObjectClass' SUP ndsLoginProperties STRUCTURAL MUST
 6   (cn $ sn) MAY (description $ seeAlso $ telephoneNum
 7  ber $ fullName $ givenName $ initials $ uid $ userPa
 8  ssword) X-NDS_NAMING ('cn' 'uid') X-NDS_CONTAINMENT 
 9  ('organization' 'organizationalUnit' 'domain') X-NDS
10  _NAME 'Person' X-NDS_NOT_CONTAINER '1' X-NDS_NONREMO
11  VABLE '1')
12


必須属性

必須属性は、オブジェクトクラス記述のMUSTセクションにリストします。personオブジェクトクラスの場合は、必須属性はcnとsnです。


オプション属性

オプション属性は、オブジェクトクラス記述のMAYセクションにリストします。personオブジェクトクラスのオプション属性は、description、seeAlso、telephoneNumber、fullName、givenName、initials、uid、およびuserPasswordです。


包含ルール

定義されるオブジェクトクラスを包含するオブジェクトクラスは、オブジェクトクラス記述のX-NDS_CONTAINMENTセクションに指定します。personオブジェクトクラスを包含するオブジェクトクラスは、organization、organizationalUnit、およびdomainです。


新しい属性を追加する

属性を追加するには、単に、NDSAttributeTypeDescriptionの仕様に従った属性値をsubschemaSubentryのattributes属性に追加します。

NDSAttributeTypeDescription = "(" whsp
  numericoid whsp  ; AttributeType identifier
  [ "NAME" qdescrs ]  ; name used in AttributeType
  [ "DESC" qdstring ]  ; description
  [ "OBSOLETE" whsp ]
  [ "SUP" woid ]  ; derived from this other AttributeType
  [ "EQUALITY" woid]  ; Matching Rule name
  [ "ORDERING" woid]  ; Matching Rule name
  [ "SUBSTR" woid ]  ; Matching Rule name
  [ "SYNTAX" whsp noidlen whsp ] ;  Syntax OID
  [ "SINGLE-VALUE" whsp ]  ; default multi-valued
  [ "COLLECTIVE" whsp ]  ; default not collective
  [ "NO-USER-MODIFICATION" whsp ] ;  default user modifiable
  [ "USAGE" whsp AttributeUsage ] ;  default userApplications
  [ "X-NDS_PUBLIC_READ" qdstrings ]
                             ; default not public read ('0')
  [ "X-NDS_SERVER_READ" qdstrings ]
                              ; default not server read ('0')
  [ "X-NDS_NEVER_SYNC" qdstrings ]
                               ; default not never sync ('0') 
  [ "X-NDS_NOT_SCHED_SYNC_IMMEDIATE" qdstrings ]
                            ;  default sched sync immediate ('0')
  [ "X-NDS_SCHED_SYNC_NEVER" qdstrings ]
                                  ;  default schedule sync ('0')
  [ "X-NDS_LOWER_BOUND" qdstrings ]
                              ;  default no lower bound('0')
                                    ;(upper is specified in SYNTAX)
  [ "X-NDS_NAME_VALUE_ACCESS" qdstrings ]
                         ; default not name value access ('0')
  [ "X-NDS_NAME" qdstrings ]  ; legacy NDS name 
  whsp ")"

次の例のLDIFファイルでは、title属性タイプをスキーマに追加します。

 1 version:1
 2 dn:cn=schema
 3 changetype:add
 4 attributeTypes:( 2.5.4.12 NAME 'title' DESC 'Standa
 5  rd Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
 6  64} X-NDS_NAME 'Title' X-NDS_NOT_SCHED_SYNC_IMMEDIA
 7  TE '1' X-NDS_LOWER_BOUND '1')
 8


単一値と複数値

属性は、明示的に単一値として定義されない限り、デフォルトでは複数値です。次の例のLDIFファイルでは、SYNTAXセクションの後にSINGLE-VALUEキーワードを追加することによって、titleを単一値として定義しています。

 1 version:1
 2 dn:cn=schema
 3 changetype:add
 4 attributeTypes:( 2.5.4.12 NAME 'title' DESC 'Standa
 5  rd Attribute' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15{
 6  64} SINGLE-VALUE X-NDS_NAME 'Title' X-NDS_NOT_SCHED
 7  _SYNC_IMMEDIATE '1' X-NDS_LOWER_BOUND '1')
 8


既存のオブジェクトクラスへオプション属性を追加する

通常、新しいスキーマエレメントを追加する場合は問題ありませんが、既存のスキーマエレメントを変更または拡張する場合には注意が必要です。すべてのスキーマエレメントはOIDによって固有に識別されるため、標準スキーマエレメントを拡張すると、元のOIDを使用する場合でも実際にはそのエレメントに対して2つめの定義が作成されます。このため、不整合が発生することがあります。

スキーマエレメントの変更が必要な場合もあります。たとえば、開発しながらスキーマエレメントを洗練していくときに、新しいスキーマエレメントの拡張または修正が必要な場合があります。次のような場合は、クラスに直接新しい属性を追加せずに、通常は補助クラスのみを使用します。


補助クラスを追加または削除する

次のサンプルLDIFファイルは、2つの新しい属性と、この新しい属性に付随する補助クラスを作成して、inetOrgPersonエントリをエントリのオブジェクトクラスとして補助クラスと補助クラスの属性値に追加します。

version:1
# Add an attribute to track a bear's hair.The attribute is 
# multi-valued, uses a case ignore string syntax,  
# and has public read rights 
# Values may include:long hair, short, curly, straight, 
# none, black, and brown 
# X-NDS_PUBLIC_READ '1' The 1 allows public read, 
# 0 denies public read 
dn:cn=schema 
changetype:modify 
add:attributeTypes
attributeTypes:( 2.16.840.1.113719.1.186.4.10 NAME
'bearHair' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15
X-NDS_PUBLIC_READ '1' )

# add an attribute to store a bear's picture 
dn:cn=schema 
changetype:modify 
add:attributeTypes 
attributeTypes:( 2.16.840.1.113719.1.186.4.11 NAME
'bearPicture' SYNTAX 1.3.6.1.4.1.1466.115.121.1.5
SINGLE-VALUE )

# create an Auxiliary class for the bearfeatures 
dn:cn=schema 
changetype:modify 
add:objectclasses 
objectclasses:(2.16.840.1.113719.1.186.6.101 NAME
'bearFeatures' MAY (bearHair $ bearPicture) AUXILIARY)

# now create a user named booboo
dn:cn=booboo,o=jellystone 
changetype:add 
cn:booboo 
sn:bear 
givenName:booboo 
bearHair:Short 
bearHair:Brown 
bearHair:Curly 
bearPicture:<file:///c:/tmp/alien.jpg 
objectClass:top 
objectClass:person 
objectClass:inetOrgPerson 
objectClass:bearFeatures 

# now create a person named yogi that will later be changed
# into a bear when bearFeatures is added to its objectClass
# list
dn:cn=yogi,o=jellystone
changetype:add
cn:yogi
sn:bear
givenName:yogi
objectClass:top
objectClass:person
objectClass:inetOrgPerson

# now morph yogi into a bear by adding bearFeatures
dn:cn=yogi,o=jellystone
changetype:modify
add:objectClass
objectClass:bearFeatures
-
add:bearHair
bearHair:long
bearHair:black
#bearPicture:<file:///c:/tmp/yogi.jpg>
-

# to morph yogi back to a person, simply delete the
# objectClass bearFeatures
dn:cn=yogi,o=jellystone
changetype:modify
delete:objectClass
objectClass:bearFeatures

補助クラスを削除するときに、objectClassリストから補助クラスを削除する場合には、補助クラスに関連する値を削除する必要はありません。eDirectoryによって、この処理は自動的に行われます。

補助クラスが"MUST"属性を保持している場合、補助クラスをobjectClassリストに追加する同じ変更操作でも、補助クラスをすべて指定する必要があり、これを怠ると変更に失敗します。