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
属性を追加するには、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ルールを遵守していない場合、LDIFレコード(LDAPサーバで生成されたLDIF形式またはレコード)のXML処理は成功しません。