https://blog.csdn.net/white_smile/article/details/19565701
1.软件安装
1.1系统环境
-
Linux:Fedora 17 x86.64
-
Openldap:openldap2.4.33
-
PostgreSQL:PostgreSQL 9.1.6
-
unixODBC:unixODBC 2.3.1
1.2必须软件包
openldap.x86_64
openldap-clients.x86_64 #提供一些客户端程序,测试可用
openldap-servers.x86_64
openldap-servers-sql.x86_64 #后端数据库相关,必须安装
openldap-devel.x86_64 #devel包,可选择行安装
1.3安装步骤
以上这些必备软件包在fedora17下直接通过yum安装即可:
[root@fedoraopenldap]# yum install openldap.x86_64
[root@fedoraopenldap]# yum install openldap-clients.x86_64
[root@fedoraopenldap]# yum install openldap-servers.x86_64
安装完成后,查看安装包是否全部安装:
[root@fedoraopenldap]# yum list openldap*
2使用PostgreSQL作为后台数据库
2.1导入测试数据
如果使用其它关系型数据库作为LDAP的后台,则需要进行数据库的映射,目录:
/usr/share/doc/openldap-servers-sql-2.4.33/rdbms_depend里提供了各类数据库的映射文件和测试数据。测试数据和映射文件也可以从以下站点中下载:
http://www.openldap.org/faq/data/cache/978.html
导入数据之前要确认PostgreSQL和unixODBC的安装,并且PostgreSQL下建有logink数据库和unixODBC下建有Logink数据源。PostgreSQL和unixODBC的设置请参考《PostgreSQL数据库使用手册》。
往logink数据库中导入数据,运行以下命令:
[root@localhost]#cd /usr/share/doc/openldap-servers-sql-2.4.33/rdbms_depend/pgsql/
[root@localhost]#psql -U postgres logink < backsql_create.sql
[root@localhost]#psql -U postgres logink < testdb_create.sql
[root@localhost]#psql -U postgres logink < testdb_data.sql
[root@localhost]#psql -U postgres logink < testdb_metadata.sql
2.2使用管理员权限打开slapd.conf文件
-
在终端输入su-和密码;
-
运行cd /etc/openldap/;
-
运行geditslapd.conf使用gedit打开文件
2.3配置slapd.conf和ldap.conf文件
slapd.conf文件(红色部分为修改部分):
#
#See slapd.conf(5) for details on configuration options.
#This file should NOT be world readable.
#
include /etc/openldap/schema/corba.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
#Define global ACLs to disable default read access.
#引入读写权限,accessto *代表所有用户
accessto *
by selfwrite
by * read
accessto * by dn="cn=root,dc=wulisuo,dc=com" write
#Do not enable referrals until AFTER you have a working directory
#service AND an understanding of referrals.
#referral ldap://root.openldap.org
pidfile /usr/local/var/run/slapd.pid
#slapd.pid是程序运行时才生成的文件,路径可以随意指定
argsfile /usr/local/var/run/slapd.args
#同上,原本这两个文件都没有
#Load dynamic backend modules:
#modulepath /usr/local/libexec/openldap
#moduleload back_bdb.la
#moduleload back_hdb.la
#moduleload back_ldap.la
#Sample security restrictions
# Requireintegrity protection (prevent hijacking)
# Require112-bit (3DES or better) encryption for updates
# Require63-bit encryption for simple bind
#security ssf=1 update_ssf=112 simple_bind=64
#Sample access control policy:
# RootDSE: allow anyone to read it
# Subschema(sub)entry DSE: allow anyone to read it
# OtherDSEs:
# Allowself write access
# Allowauthenticated users read access
# Allowanonymous users to authenticate
# Directivesneeded to implement policy:
#access to dn.base="" by * read
#access to dn.base="cn=Subschema" by * read
#access to *
# byself write
# byusers read
# byanonymous auth
#
#if no access controls are present, the default policy
#allows anyone and everyone to read anything but restricts
#updates to rootdn. (e.g., "access to * by * read")
#
#rootdn can always read and write EVERYTHING!
#设定日志
loglevel 256
#如果想要使用PostgreSQL或MySQL数据库必须导入以下两行
modulepath /usr/lib64/openldap
moduleload back_sql.la
#######################################################################
#sqldatabase definitions
#######################################################################
database sql
#修改合适的前缀
suffix "dc=wulisuo,dc=com"
rootdn "cn=root,dc=wulisuo,dc=com"
rootpwsecret
#dbname代表ODBC中设置的数据源
dbname Logink
#dbuser代表postgresql用户
dbuser postgres
dbpasswd postgres
insentry_stmt "insertinto ldap_entries (id,dn,oc_map_id,parent,keyval) values ((selectmax(id)+1 from ldap_entries),?,?,?,?)"
upper_func "upper"
strcast_func "text"
concat_pattern "?||?"
has_ldapinfo_dn_ru no
设置完文件后运行:/usr/sbin/slaptest-f /etc/openldap/slapd.conf进行测试,如果PostgreSQL数据库中没有存在测试数据,则会出现“bi-db-openfailed! Test would using the -u ”。导入测试数据请查看相应的步骤,如果出现其他错误则根据提示进行相应改写。
ldap.conf文件:
可以不进行配置,如果要进行配置则修改以下两行:
#BASEdc=wulisuo,dc=com
#URIldap://ldap.wulisuo.comldap://ldap-master.wulisuo.com:666
2.4启动LDAP服务
启动LDAP服务之前先要启动PostgreSQL服务,然后运行以下命令:
[root@localhost~]# /usr/sbin/slapd -d 256 -f /etc/openldap/slapd.conf
关闭服务:运行kill-INT `cat /usr/local/var/run/slapd.pid`,其中slapd.pid的路径可以在slapd.conf中查询。
3 LDAP后端数据库操作
3.1插入节点
-
打开终端,运行vi init.ldif文件;
-
输入i开始编辑文件;
-
输入以下内容,其中dc和cn字段参照之前在slapd.conf中的设置:
dn:dc=wulisuo,dc=com
objectClass:dcObject
objectClass:organization
dc:wulisuo
o:wulisuoCompany
description: dCorporation
-
退出init.ldif文件的编辑;
-
执行添加命令:
ldapadd-f init.ldif -x -D "cn=root,dc=wulisuo,dc=com" -w secret
其中secret代表你设置的密码,如果没有设置过便为secret;
-
查询记录是否添加成功,运行以下命令:
/usr/bin/ldapsearch-x -b "dc=wulisuo,dc=com"
如果出现以下内容则表示记录添加成功,否则重新查看ldif文件里的内容:
dn:dc=wulisuo,dc=com
objectClass:dcObject
objectClass:organization
dc: wulisuo
o: wulisuoCompany
description: dCorporation
# searchresult
search: 2
result: 0Success
#numResponses: 3
# numEntries:2
3.2数据库操作
以下数据的插入需要自定义objectClass : organizationRole、organizationUnit
数据插入
-
首先设置根节点属性,上一小节中已经插入了1条记录,每一条记录由一个dn来识别,如
dn:dc=wulisuo,dc=com
objectClass:dcObject
objectClass:organization
dc:wulisuo
o:wulisuoCompany
description: dCorporation
这条记录为根节点,识别标志为“dn:dc=wulisuo,dc=com”;
-
在原有数据记录下增加记录,可以使用文件增加记录,比如新建一个second.ldif文件,里面写入信息:
dn:ou=wuliu,dc=wulisuo,dc=com
objectClass:organizationalUnit
ou:wuliu
该条记录表示在”dn:dc=wulisuo,dc=com”下面增加一个节点,该结点的名称定义为”ou:wuliu”,里面的属性值来自”objectClass:organizationalUnit”;
-
运行:ldapadd-x -D "cn=root,dc=wulisuo,dc=com" -w secret -f./second.ldif
如果出现”addingnew entry "ou=wuliu,dc=wulisuo,dc=com"则表示插入成功;
-
如果想在”dn:ou=wuliu,dc=wulisuo,dc=com”节点下增加一些用户节点,那么操作类似,新建一个user.ldif文件,输入:
dn:uid=HE001,ou=wuliu,dc=wulisuo,dc=com
uid:HE001
cn:Chen Biquan
sn:Xu
userPassword:123456
objectClass:inetOrgPerson
dn:uid=HE002,ou=wuliu,dc=wulisuo,dc=com
uid:HE002
cn:Li Lin
sn:Li
userPassword:123456
objectClass:inetOrgPerson
dn:uid=HE003,ou=wuliu,dc=wulisuo,dc=com
uid:HE003
cn:Xu Lexun
sn:Xu
userPassword:123456
objectClass:inetOrgPerson
dn:uid=HE004,ou=wuliu,dc=wulisuo,dc=com
uid:HE004
cn:Ma Qiang
sn:Ma
userPassword:123456
objectClass:inetOrgPerson
dn中的ou=wuliu代表该节点隶属于”dn:ou=wuliu,dc=wulisuo,dc=com“节点;
-
运行命令:ldapadd-x -D "cn=root,dc=wulisuo,dc=com" -w secret -f ./user.ldif
数据删除
-
在ldap目录中有一条记录,删除这条记录:
#Manager, wulisuo.com
dn:ou=Manager,dc=wulisuo,dc=com
objectClass:organizationalUnit
ou::TWFuYWdlciA=
-
运行命令:
ldapdelete -x-D 'cn=root,dc=wulisuo,dc=com' -w secret'ou=Manager,dc=wulisuo,dc=com'
-
如果删除成功则会出现相应的提示
数据修改
-
在ldap目录中有一条记录,修改这条记录:
# worker,wulisuo.com
dn:ou=worker,dc=wulisuo,dc=com
objectClass:organizationalUnit
ou: worker
-
新建一个modify.ldif文件,在里面输入内容:
dn:ou=worker,dc=wulisuo,dc=com
changetype:modify
add:description
description:TheProject Manager
-
运行命令:
ldapmodify-x -D"cn=root,dc=wulisuo,dc=com" -w secret -f modify.ldif
-
注意:dn中的属性无法使用ldapmodify命令进行修改,想要修改dn中的属性时最好先删除,再添加记录
-
modify.ldif文件格式,如:
#HE004, wuliu, wulisuo.com
dn:uid=HE003,ou=wuliu,dc=wulisuo,dc=com
add:descrption
description: astudent
delete: sn
replace: mail
mail:[email protected].
数据搜索
-
运行命令:
ldapsearch -D"cn=root,dc=wulisuo,dc=com" -w secret -bou=wuliu,dc=wulisuo,dc=com -s sub "(objectClass=inetOrgPerson)"> hz.ldif ;
-
可以设置多个条件,如:
ldapsearch-D"cn=root,dc=wulisuo,dc=com" -w secret -bou=wuliu,dc=wulisuo,dc=com -s sub"(&(objectClass=inetOrgPerson)(uid=HE004))">hz.ldif ;
>hz.ldif表示将结果导出到hz.ldif文件中-s代表搜索范围
-
另一种搜索方法:
/usr/bin/ldapsearch-x -b "dc=wulisuo,dc=com"
远程操作
-
ldapmodify-a -h host -p port -D <bind dn> -w <password> -f <ldiffile>
-
ldapdelete-h host -p port -D <bind dn> -w <password> [dn1 dn2 ...]
-
ldapsearch-h host -p port -D<bind dn> -w <password> -b<dn>-s<scope>”(filter)” >print the information into file
例:ldapsearch-h 192.168.0.116 -p 389 -D”cn=root,dc=wulisuo,dc=com” -w secret-b ou=wuliu,dc=wulisuo,dc=com -s sub“(&(objectClass=inetOrgPerson)(uid=HE004))”> hz.ldif
3.3标识符说明
-
dn:distinguish name,用于识别一条记录,内有多个标识符组成;
-
objectClass:包含属性的类,如果引用了objectClass:person的话可以使用username和userpassword这两个属性;
-
ou:objectClass organizationUnit中的属性,如果不使用BDB数据库需要自定义;
-
cn:objectClass inteorgperson中的属性,定义为常用名称;
-
sn:objectClass inteorgperson中的属性,为姓氏部分;
-
givenName:objectClass inteorgperson中的属性,为用户姓名;
-
userPassword:objectClass inteorgperson中的属性,为用户密码;
-
telephoneNumber:objectClass inteorgperson中的属性,为电话号码;
3.4常见错误
错误1:ldap_add:Invalid syntax (21)
additionalinfo: objectclass: value #0 invalid per syntax
原因:编写ldif文件时要注意规范,每一行后面不能留有空格,否则就会出现错误,所以去掉每一之后的空格便可以了。
错误2:additionalinfo: operation not permitted within namingContext
原因:使用PostgreSQL作为LDAP后台数据库时,大部分的objectClass需要自行定义,给定的objectClass只有:inetOrgPerson、document、organization、referral四个。
4objectClass使用方法
4.1自定义前提条件
如果后台数据库使用的PostgreSQL或MySQL之类的数据库,自定义的objectClass必须要先在schema文件中定义,然后把它引入到slapd.conf文件中,最后在后台数据库中进行映射。
4.2重要的表和文件
导入映射文件和测试数据后,logink数据库中生成了几张关键的表:
-
ldap_entries:存储记录的dn信息;
-
ldap_oc_mappings:objectClass的映射源,里面定义了每个objectClass所对应的表和操作属性;
-
ldap_attr_mappings:定义了objectClass里的属性及其设置,属性的容器为不同的表;
-
ldap_entry_objclasses:专门用于存储辅助属性;
testdb_metadata.sql:定义了insert各个字段的含义。
4.3objectClass简介
objectClass分为:Abstract、Structural、AUXIALIARY,例如:top、penson、dcobject,用于储存记录的只能是Structural类型的objectClass,其余的只是用作扩展;自定义objectClass时要先定义一个schema文件,在文件里先定义objectClass,然后将此文件引入到slapd.conf文件中。如果引入的objectClass没有在schema文件中定义过,LDAP蒋启动不了并出现数据库出错的错误。
4.4映射organizationalRole
由于organizationalRole已经在core.schema文件中定义,所以只要进行映射便可以,不需要额外在schema文件中定义。查看organizationalRole的属性,必须属性为cn,可选属性有很多,这里我们选用registeredAddress;
步骤1:在数据库logink中创建2个表:organrole、organrole_id_seq,organrole用来存储organizationalRole2个属性所代表的数据。表的创建可以通过导入sql文件,sql文件如下:
droptable organRole;
dropsequence organRole_id_seq;
createtable organRole (
idserial not null primary key,
namevarchar(255),
regAddressvarchar(255)
);
步骤2:再通过导入一个sql文件创建ldap_oc_mappings、ldap_attr_mappings里的数据,即为映射的信息,sql文件如下(红色为注释部分):
--objectClass mappings: these may be viewed as structuralObjectClass,the ones that are used to decide how to build an entry
insert intoldap_oc_mappings(id,name,keytbl,keycol,create_proc,delete_proc,expect_return) values(5,'organizationalRole','organRole','id','SELECTcreate_organRole()','DELETE FROM organrole WHERE id=?',0);
--attributeType mappings: describe how an attributeType for a certainobjectClass maps to the SQL data.
insert intoldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values (16,5,'cn','organRole.name','organRole',NULL,'UPDATE organRoleSET name=? WHERE id=?','UPDATE organRole SET name='''' WHERE name=?AND id=?',3,0);
insert intoldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values(17,5,'registeredAddress','organRole.regAddress','organRole',NULL,'UPDATEorganRole SET regAddress=? WHERE id=?','UPDATE organRole SETregAddress='''' WHERE (regAddress=? OR regAddress='''') ANDid=?',3,0);
--procedures
--these procedures are specific for this RDBMS and are used in mappingobjectClass and attributeType creation/modify/deletion
createfunction create_organRole () returns int
as '
select setval(''organRole_id_seq'', (select case when max(id) is null then 1 elsemax(id) end from organRole));
insert intoorganRole (id,name,regAddress) values ((select case when max(id) isnull then 1 else nextval(''organRole_id_seq'') end fromorganRole),'''','''');
selectmax(id) from organRole
' language'sql';
步骤3:测试启动LDAP即可使用objectClassorganizationalRoel ;
4.5往inetorgPerson中添加自定义属性
inetorgPerson已经在inetorgPerson.schema中定义,存放位置为/etc/openldap/schema/(不同的安装路径存放的路径也不一样)。在inetorgPerson中添加自定义属性finger,步骤如下:
步骤1:在inetorgPerson.schema中添加属性finger,只要将如下信息加入到inetorgPerson.schema文件中即可:
#newatttribute:finger
attributetype( 2.16.840.1.113730.3.1.217
NAME'finger'
DESC'RFC2798: preferred written or spoken language for a person'
EQUALITYcaseIgnoreMatch
SUBSTRcaseIgnoreSubstringsMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.15{128}
SINGLE-VALUE)
步骤2:在inetorgPerson.schema中修改classinetorgPerson,只要在最后添加新增加的属性即可(红色部分为添加部分):
objectclass (2.16.840.1.113730.3.2.2
NAME'inetOrgPerson'
DESC'RFC2798: Internet Organizational Person'
SUPorganizationalPerson
STRUCTURAL
MAY (
audio$ businessCategory $ carLicense $ departmentNumber $
displayName$ employeeNumber $ employeeType $ givenName $
homePhone$ homePostalAddress $ initials $ jpegPhoto $
labeledURI$ mail $ manager $ mobile $ o $ pager $
photo$ roomNumber $ secretary $ uid $ userCertificate $
x500uniqueIdentifier$ preferredLanguage $
userSMIMECertificate$ userPKCS12$ finger)
)
步骤3:在数据库中新建一个表fingerInfo,用于存放finger的信息,由于inetorgPerson存放数据的表为persons,所以fingerInfo表中要添加一个外键,用于跟persons关联,生成表的sql文件如下,导入该sql文件即可:
droptable fingerInfo;
createtable fingerInfo (
id serial not null primary key,
finfo varchar(255),
pers_idint not null
);
步骤4:往ldap_attr_mappings表中导入映射信息,便跟inetorgPerson关联,导入映射信息的sql文件如下,导入该sql文件即可:
--attributeType mappings: describe how an attributeType for a certainobjectClass maps to the SQL data.
insertinto ldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values(18,1,'finger','fingerinfo.finfo','persons,fingerinfo','fingerinfo.pers_id=persons.id','SELECTadd_finfo(?,?)','DELETE FROM fingerinfo WHERE finfo=? ANDpers_id=?',3,0);
--procedures
--these procedures are specific for this RDBMS and are used in mappingobjectClass and attributeType creation/modify/deletion
createfunction add_finfo (varchar, int) returns int
as'
selectsetval (''fingerinfo_id_seq'', (select case when max(id) is null then1 else max(id) end from fingerinfo));
insertinto fingerinfo (id,finfo,pers_id)
values(nextval(''fingerinfo_id_seq''),$1,$2);
selectmax(id) from fingerinfo
'language 'sql';
步骤5:重新启动LDAP即可;
4.6自行定义一个objectClass
4.6.1schema文件部份
一个objectClass包含两部分:一部分为属性的定义,另一部分为自身的定义。假设自行定义一个objectClass:myNodeObject,那么要先在/etc/openldap/schema/目录下新建一个schema文件:myNodeObject.shcema(该文件名要跟objectClass的名称一致),文件内容如下:
attributeType(1.1.2.1.100
NAME'myNodeID'
DESC'节点编号'
EQUALITYcaseIgnoreMatch
SYNTAX1.3.6.1.4.1.1466.115.121.1.15
SINGLE-VALUE)
attributeType( 1.1.2.1.101
NAME'myNodeName'
DESC'节点名称'
SYNTAX1.3.6.1.4.1.1466.115.121.1.15)
objectclass( 1.1.2.2.1
NAME'myNodeObject'
DESC'myNode'
SUPtop STRUCTURAL
MUST(myNodeID $ myNodeName))
4.6.2attributeType部份介绍
attributeType(1.1.2.1.100 ----------对象标识符
NAME'myNodeID' ----------属性的名称
DESC'节点编号' --------- 属性的描述
EQUALITYcaseIgnoreMatch ----------规则匹配
SYNTAX1.3.6.1.4.1.1466.115.121.1.15 ----------语法标识符
SINGLE-VALUE) ----------默认的多值
对象标识符(OID)是唯一的,如果想把目录建设成全球目录的一部分,应该去申请一个合法的OID,申请地址:http://pen.iana.org/pen/PenApplication.page;如果对目录没有什么要求,那么设计的对象标识符不要跟已有的对象标识符冲突就行了,属性默认的标识符前缀为1.1.2.1.......。
规则匹配和语法标志符的设计可以参考openldap官网上的《openldap-Admin-Guide》pdf文件,或是参考以下站点里的信息:http://blog.csdn.net/chong232/article/details/2257290。
表1对象标识符的层次结构
OID |
Assignment |
1.1 |
Organization'sOID |
1.1.1 |
SNMPElements |
1.1.2 |
LDAPElements |
1.1.2.1 |
AttributeTypes |
1.1.2.1.1 |
x-my-Attribute |
1.1.2.2 |
ObjectClasses |
1.1.2.2.1 |
x-my-ObjectClass |
表2常用的语法标识符
Name |
OID |
Description |
boolean |
1.3.6.1.4.1.1466.115.121.1.7 |
Booleanvalue |
directoryString |
1.3.6.1.4.1.1466.115.121.1.15 |
Unicode(UTF-8) string |
distinguishedName |
1.3.6.1.4.1.1466.115.121.1.12 |
LDAPDN |
integer |
1.3.6.1.4.1.1466.115.121.1.27 |
integer |
numericString |
1.3.6.1.4.1.1466.115.121.1.36 |
numericstring |
OID |
1.3.6.1.4.1.1466.115.121.1.38 |
objectidentifier |
octetString |
1.3.6.1.4.1.1466.115.121.1.40 |
arbitraryoctets |
表3常用的匹配规则
Name |
Type |
Description |
booleanMatch |
equality |
boolean |
caseIgnoreMatch |
equality |
Caseinsensitive,space insensitive |
caseIgnoreOrderingMatch |
ordering |
caseinsensitive, space insensitive |
caseIgnoreSubstringsMatch |
substring |
caseinsensitive, space insensitive |
caseExactMatch |
equality |
casesensitive, space insensitive |
caseExactOrderingMatch |
ordering |
casesensitive, space insensitive |
caseExactSubstringsMatch |
substring |
casesensitive, space insensitive |
distinguishedNameMatch |
equality |
distinguishedname |
integerMatch |
equality |
integer |
integerOrderingMatch |
ordering |
integer |
numericStringMatch |
equality |
numerical |
numericStringOrderingMatch |
equality |
numerical |
numericStringSubstringsMatch |
substring |
numerical |
octetStringMatch |
equality |
octetstring |
octetStringOrderingMatch |
ordering |
octetstring |
octetStringSubstringsMatchordering |
octetst |
ring |
objectIdentiferMatch |
equality |
objectidentifier |
SINGLE-VALUE用来确定是否只是用一个匹配规则。
4.6.3objectClass部份介绍
objectclass( 1.1.2.2.1 ----------------对象标识符
NAME'myNodeObject' ----------objectClass名称
DESC'myNode' ---------------objectClass描述
SUPtop STRUCTURAL -------------------继承的类型
MUST(myNodeID $ myNodeName) ------------------必须的属性
MAY()) ------------------可选的属性
objectClass默认的标识符前缀为1.1.2.2......,否则就需要申请一个有效的OID,继承的类型决定了objectClass的类型,如果SUPtop dcObject,表明这个objectClass是一个抽象的对象类;如果SUPtop STRUCTURAL,表明这个objectClass可以用来存储记录;如果SUPtopAUXIALIARY表明这个objectClass是一个辅助的对象类,不能直接用来使用。
4.6.4后台数据库映射
将myNodeObject映射到PostgreSQL数据库里:
步骤1:建立一张表myNode用来存放各类属性的数据,建表SQL文件如下:
droptable myNode;
createtable myNode (
id serial not null primary key,
myNodeID varchar(255),
myNodeNamevarchar(255)
);
步骤2:在ldap_oc_mappings表中导入objectClass并在ldap_attr_mappings表中映射属性,SQL语句如下:
--objectClass mappings: these may be viewed as structuralObjectClass,the ones that are used to decide how to build an entry
insertinto ldap_oc_mappings(id,name,keytbl,keycol,create_proc,delete_proc,expect_return) values(5,'myNodeObject','mynode','id','SELECT create_mynode()','DELETE FROMmynode WHERE id=?',0);
--attributeType mappings: describe how an attributeType for a certainobjectClass maps to the SQL data.
insertinto ldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values (19,5,'myNodeID','mynode.mynodeid','mynode',NULL,'UPDATEmynode SET mynodeid=? WHERE id=?','UPDATE mynode SET mynodeid=''''WHERE (mynodeid=? OR mynodeid='''') AND id=?',3,0);
insertinto ldap_attr_mappings(id,oc_map_id,name,sel_expr,from_tbls,join_where,add_proc,delete_proc,param_order,expect_return)values (20,5,'myNodeName','mynode.mynodename','mynode',NULL,'UPDATEmynode SET mynodename=? WHERE id=?','UPDATE mynode SETmynodename='''' WHERE (mynodename=? OR mynodename='''') ANDid=?',3,0);
--procedures
--these procedures are specific for this RDBMS and are used in mappingobjectClass and attributeType creation/modify/deletion
createfunction create_mynode () returns int
as'
selectsetval (''mynode_id_seq'', (select case when max(id) is null then 1else max(id) end from mynode));
insertinto mynode (id,mynodeid,mynodename)
values((select case when max(id) is null then 1 elsenextval(''mynode_id_seq'') end from mynode),'''','''');
selectmax(id) from mynode
'language 'sql';
步骤3:将myNodeObject.schema导入到slapd.conf文件中,重启LDAP即可使用该objectClass。