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です。
メモ:userPassword属性は、オプション(MAY)属性には使用できません。このLDIF形式を使用して、新しいobjectClassでこの属性を必須(MUST)属性に使用してスキーマを拡張しようとしても、操作は失敗します。
定義されているオブジェクトクラスを包含するオブジェクトクラスは、オブジェクトクラス記述の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エントリをエントリのオブジェクトクラスとしてauxiliaryクラスとauxiliaryクラスの属性値に追加します。
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 bobby dn: cn=bobby,o=bearcave changetype: add cn: bobby sn: bear givenName: bobby 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 john that will later be changed # into a bear when bearFeatures is added to its objectClass # list dn: cn=john,o=bearcave changetype: add cn: John sn: bear givenName: john objectClass: top objectClass: person objectClass: inetOrgPerson # now morph john into a bear by adding bearFeatures dn: cn=john,o=bearcave changetype: modify add: objectClass objectClass: bearFeatures - add: bearHair bearHair: long bearHair: black #bearPicture:< file:///c:/tmp/john.jpg> - # to morph john back to a person, simply delete the # objectClass bearFeatures dn: cn=john,o=bearcave changetype: modify delete: objectClass objectClass: bearFeatures
補助クラスの削除にあたって、objectClassリストからauxiliaryクラスを削除する場合には、auxiliaryクラスに関連するすべての値を削除する必要はありません。この処理はeDirectoryによって自動的に行われます。
auxiliaryクラスにMUST属性がある場合、auxiliaryクラスをobjectClassリストへ追加する変更操作でもこれらの属性を指定する必要があります。これらの属性が指定されていない場合、変更は失敗します。
個々のレコードがXMLファイルで指定されたすべてのXMLルールを遵守していない場合、LDIFレコード(LDAPサーバで生成されたLDIF形式またはレコード)のXML処理は成功しません。