Форум проекта Pro-LDAP.ru
Общие вопросы по LDAP => Общий раздел => Тема начата: Обухов Дмитрий от 04 Январь 2015, 18:22:13
-
пока разбираюсь с LDAP, так что слишком много материала
вопрос:
если мы собираем некоторый ldif, который допустим добавляет один-второй-третий объектный класс, а так же допустим добавляет пять свойств и три записи.
и допустим где-то в конце этого ldif ошибка. вопрос: на этой ошибке что будет с базой?
вот эти успешные модифаи они откатятся или останутся в БД?
-
Здравствуйте, Дмитрий! Атомарность внесения изменений в каталог предусмотрена в стандарте (см. раздел 4.6 RFC4511 (http://pro-ldap.ru/tr/rfc/rfc4511.html#section-4.6)). Но тут надо понимать, что если Вы составляете LDIF, который изменяет несколько записей в каталоге, то атомарность будет соблюдаться только в изменениях, вносимых за один раз в одну запись. Проще показать это на примере. Имея такие записи в каталоге:
# ldapsearch -x -LLL -b 'ou=People,dc=mycompany,dc=ru' -s one
dn: uid=vitaly,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: vitaly
cn: Vitaly Fridzon
sn: Fridzon
dn: uid=anton,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: anton
cn: Anton Ponkrashov
sn: Ponkrashov
dn: uid=alex,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: alex
cn: Aleksey Savrasenko
sn: Savrasenko
составим такой LDIF для их изменения:
# Добавление вспомогательного объектного класса и атрибутов к записи vitaly
dn: uid=vitaly,ou=People,dc=mycompany,dc=ru
changetype: modify
add: objectClass
objectClass: posixAccount
-
add: uidNumber
uidNumber: 1001
-
add: gidNumber
gidNumber: 1001
-
add: homeDirectory
homeDirectory: /home/vitaly
# Изменение записи anton -- ошибка в удалении несуществующего атрибута ou
dn: uid=anton,ou=People,dc=mycompany,dc=ru
changetype: modify
add: description
description: Team Russia's captain
-
delete: ou
ou: Krasniy Oktyabr Volgograd
-
add: ou
ou: Uniks Kazan
# Добавление новой записи andrey
dn: uid=andrey,ou=People,dc=mycompany,dc=ru
changetype: add
objectClass: inetOrgPerson
uid: andrey
cn: Andrey Kirilenko
sn: Kirilenko
Тут у нас фактически три фрагмента, начинающихся со строки dn: ... и заканчивающихся пустой строкой. Два первых вносят изменения в существующие записи, последний добавляет новую запись. В первом фрагменте все изменения верны: будет добавлен вспомогательный объектный класс и его обязательные атрибуты. Во втором фрагменте первое изменение (добавление атрибута description) верно, а второе (удаление несуществующего атрибута ou) -- нет. В третьем фрагменте также всё верно. Попробуем применить наш LDIF:
# ldapmodify -D 'cn=manager,ou=System,dc=mycompany,dc=ru' -W -f ./some-changes.ldif
Enter LDAP Password:
modifying entry "uid=vitaly,ou=People,dc=mycompany,dc=ru"
modifying entry "uid=anton,ou=People,dc=mycompany,dc=ru"
ldap_modify: No such attribute (16)
additional info: modify/delete: ou: no such attribute
Как видите, изменение первой записи прошло успешно, изменение второй завершилось ошибкой (no such attribute), на этом работа ldapmodify завершилась, так что до третьей записи дело вообще не дошло (это поведение по умолчанию утилиты ldapmodify, его можно переопределить опцией -c). Посмотрим, что у нас в каталоге:
# ldapsearch -x -LLL -b 'ou=People,dc=mycompany,dc=ru' -s one
dn: uid=vitaly,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
objectClass: posixAccount
uid: vitaly
cn: Vitaly Fridzon
sn: Fridzon
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/vitaly
dn: uid=anton,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: anton
cn: Anton Ponkrashov
sn: Ponkrashov
dn: uid=alex,ou=People,dc=mycompany,dc=ru
objectClass: inetOrgPerson
uid: alex
cn: Aleksey Savrasenko
sn: Savrasenko
Как видите, первая запись изменена, а вторая -- нет, даже то изменение, которое было верно, не применилось. Так что атомарность действует на уровне одной записи за один проход (от строки dn: ... до пустой строки).
Надеюсь, я Вас не запутал.
Егор
-
да все понятно, спасибо.
хгм, как же этим пользоваться тогда.
-
Здравствуйте!
хгм, как же этим пользоваться тогда.
Да всё просто:
- Делайте модификации поэтопно, по одной записи за раз.
- Формируйте корректный LDIF -- Вы же его не руками будете писать. А если Вы пишете приложение на Perl, так тем более, перед тем как посылать операцию на API можно всё сто раз перепроверить.
Егор