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です。

注:  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エントリをエントリのオブジェクトクラスとして補助クラスと補助クラスの属性値に追加します。

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リストから補助クラスを削除する場合は、補助クラスに関連付けられているすべての値を削除する必要はありません。この処理はeDirectoryによって自動的に行われます。

補助クラスにMUST属性がある場合、補助クラスをobjectClassリストへ追加する変更操作でもこれらの属性を指定する必要があります。これらの属性が指定されていない場合、変更は失敗します。


XML解析で発生する既知の問題

個々のレコードがXMLファイルで指定されたすべてのXMLルールを遵守していない場合、LDIFレコード(LDAPサーバで生成されたLDIF形式またはレコード)のXML処理は成功しません。