Assignation de schéma. Novell Pilote DirXML pour JDBC
Novell Confidential Manual (FRA) 28 October 2003
5
Configuration avancée du pilote
Après avoir installé un exemple de script de préconfiguration et de base de données, vous devez personnaliser le pilote pour une utilisation spécialisée. Cette section présente des concepts importants, des exemples de configurations et d’autres informations qui vous aideront à configurer le pilote.
« Assignation de schéma », page 47
« Table de consignation des événements », page 58
« Assignation d’événements », page 57
« Utilisation du langage SQL dans des événements XML », page 65
Assignation de schéma
Le tableau suivant présente une vue générale du mode d’assignation d’objets eDirectory Novell à des objets de base de données par le pilote.
Objet eDirectory
Arborescence
Classe
Attribut
Association
Objet Base de données
Schéma
Table/Vue
Colonne
Clé primaire
Classes de base de données logiques
Par classe de base de données logique, on entend l’ensemble des tables ou des vues utilisées pour représenter une classe eDirectory dans une base de données. Une classe de base de données logique peut se composer d’une vue unique ou d’une table parent et de zéro ou plusieurs tables enfant. Le nom de la classe de base de données logique est le nom de la table ou vue parent.
Synchronisation indirecte
Dans un modèle de synchronisation indirecte, le pilote procède aux assignations suivantes :
Objet eDirectory
Classes
Attributs
Objet Base de données
Tables
Colonnes
Configuration avancée du pilote
47
Novell Confidential Manual (FRA) 28 October 2003
Objet eDirectory
1 classe
Attribut à valeur unique
Attribut à valeurs multiples
Objet Base de données
1 table parent et
0 ou plus tables enfant
Colonne de la table parent
Colonne de la table parent ou
Colonne de la table enfant (préférée)
Assignation de classes eDirectory à des classes de base de données logiques
Dans l’exemple suivant, la classe de base de données logique emp
se compose d’une table parent emp
et d’une table enfant phone
. La classe logique emp
est assignée à la classe eDirectory
Utilisateur.
CREATE TABLE dirxml.emp
(
empno NUMERIC(8) NOT NULL,
fname VARCHAR(64),
lname VARCHAR(64),
pwdminlen NUMERIC(4),
CONSTRAINT pk_emp_empno PRIMARY KEY(empno)
);
CREATE TABLE dirxml.phone
(
empno NUMERIC(8) NOT NULL,
phone VARCHAR(64) NOT NULL,
CONSTRAINT fk_phone_empno FOREIGN KEY(empno) REFERENCES
emp(empno)
);
<rule name="MappingRule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>emp</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>Given Name</nds-name>
<app-name>fname</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Surname</nds-name>
<app-name>lname</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Password Minimum Length</nds-name>
<app-name>pwdminlen</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Telephone Number</nds-name>
48
DirXML Driver for JDBC Implementation Guide (Guide d’implémentation du pilote DirXML pour JDBC)
Novell Confidential Manual (FRA) 28 October 2003
<app-name>phone.phoneno</app-name>
</attr-name>
</attr-name-map>
</rule>
Tables parent
Les tables parent sont des tables assorties d’une contrainte de clé primaire explicite qui contiennent une ou plusieurs colonnes. Dans une table parent, une contrainte de clé primaire explicite est requise pour indiquer au pilote les champs à inclure dans une valeur d’association.
CREATE TABLE dirxml.emp
(
empno NUMERIC(8) NOT NULL,
...
CONSTRAINT pk_emp_empno PRIMARY KEY(empno)
);
Le tableau suivant contient des exemples de données pour dirxml.emp
.
empno
1
fname
Jean
lname
Untel
L’association résultante pour cette ligne serait la suivante : empno=1,table=emp,schema=dirxml
Remarque : le sort des identificateurs de base de données dans les valeurs d’association est déterminé de manière dynamique lors de l’exécution, à partir des métadonnées de base de données.
Colonnes de la table parent
Les colonnes de table parent ne peuvent contenir qu’une valeur. À ce titre, elles conviennent parfaitement pour l’assignation d’attributs eDirectory à valeur unique. Ainsi, l’attribut eDirectory
à valeur unique Password Minimum Length (longueur minimale du mot de passe) serait assigné à la colonne de table parent pwdminlen
.
Les colonnes de table parent sont préfixées, de manière implicite, avec le nom de la table parent.
Il n’est pas nécessaire de préfixer explicitement les colonnes de table parent. Ainsi, emp.fname
est l’équivalent de fname
à des fins d’assignation de schéma.
<rule name="MappingRule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>emp</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>Given Name</nds-name>
<app-name>fname</app-name>
</attr-name>
</attr-name-map>
</rule>
Configuration avancée du pilote
49
Novell Confidential Manual (FRA) 28 October 2003
Tables enfant
Les données de type binaire et chaîne en grande quantité doivent en principe être assignées à des colonnes de table parent. Pour être assigné à une colonne de table enfant, un type de données doit pouvoir faire l’objet d’une comparaison dans une instruction SQL. Or, les types de données en grande quantité ne peuvent généralement pas être comparés dans des instructions SQL.
Les données de type binaire et chaîne en grande quantité peuvent être assignées à des colonnes de table enfant si les événements
<remove-value>
de ces types comprennent des éléments
<remove-all-values>
qui sont transformés dans les feuilles de style en éléments
<addvalue>
, à raison d’un élément par valeur ajoutée.
Une table enfant est une table qui comporte une contrainte de clé étrangère sur la clé primaire de sa table parent, ce qui relie les deux tables entre elles. Les colonnes qui composent la clé étrangère de la table enfant doivent porter le même nom que les colonnes contenues dans la clé primaire de la table parent. Ce nom de colonne commun est utilisé par le canal Éditeur pour identifier toutes les lignes de la table de consignation des événements qui se rapportent à une classe de base de données logique unique.
L’exemple suivant illustre la relation qui existe entre la table parent emp
et sa table enfant phone
.
Notez que le même nom de colonne empno
est utilisé dans les deux tables.
CREATE TABLE dirxml.emp
(
empno NUMERIC(8) NOT NULL,
...
CONSTRAINT pk_emp_empno PRIMARY KEY(empno)
);
CREATE TABLE dirxml.phone
(
empno NUMERIC(8) NOT NULL,
phoneno VARCHAR(64) NOT NULL,
CONSTRAINT fk_phone_empno FOREIGN KEY(empno) REFERENCES
emp(empno)
);
La colonne contrainte dans une table enfant identifie la table parent. Dans l’exemple ci-dessus, la colonne contrainte dans la table enfant phone
est empno
. Le seul objectif de cette colonne est de relier les tables phone
et emp
. Dans la mesure où les colonnes contraintes ne contiennent pas d’informations utiles, elles doivent être omises des déclencheurs de publication et de la règle d’assignation de schéma.
La colonne non-contrainte est celle qui nous intéresse. Elle représente un seul attribut à valeurs multiples. Dans l’exemple ci-dessus, la colonne non-contrainte est phoneno
. Comme les colonnes non-contraintes peuvent contenir plusieurs valeurs, elles conviennent donc parfaitement
à l’assignation d’attributs eDirectory à valeurs multiples. Par exemple, l’assignation de l’attribut eDirectory à valeurs multiples Telephone Number à phone.phoneno
.
Toutes les colonnes d’une table enfant doivent être contraintes NOT NULL.
Remarque : différente. chaque attribut eDirectory à valeurs multiples doit être assigné à une colonne de table enfant
Le tableau suivant contient des exemples de données pour dirxml.phone
.
50
DirXML Driver for JDBC Implementation Guide (Guide d’implémentation du pilote DirXML pour JDBC)
Novell Confidential Manual (FRA) 28 October 2003
empno
1
1
phoneno
111-1111
222-2222
En cas d’assignation d’un attribut eDirectory à valeurs multiples à une colonne de table enfant, le nom de cette dernière doit être précédé de manière explicite du nom de la table enfant (par exemple, phone.phoneno
). Sinon, le pilote interprétera implicitement phoneno
en tant que emp.phoneno
, et pas phone.phoneno
.
<rule name="MappingRule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>emp</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>Telephone Number</nds-name>
<app-name>phone.phoneno</app-name>
</attr-name>
</attr-name-map>
</rule>
Attributs référentiels
L’endiguement référentiel peut être représenté dans la base de données grâce à l’utilisation de contraintes de clé étrangère. Les attributs référentiels sont des colonnes au sein d’une classe de base de données logique qui font référence aux colonnes de clé primaire des tables parent d’autres classes de base de données logiques.
Attributs référentiels à valeur unique
Deux tables parent peuvent être mises en relation grâce à une colonne unique de table parent. Cette colonne doit avoir une contrainte de clé étrangère qui pointe sur la clé primaire de l’autre table parent. L’exemple suivant met en relation une table parent unique utilisateur
avec elle-même.
CREATE TABLE user
(
idu NUMBER(8) NOT NULL,
manager NUMBER(8),
CONSTRAINT pk_user_idu PRIMARY KEY(idu),
CONSTRAINT fk_user_idu FOREIGN KEY(manager)REFERENCES
user(idu)
);
<rule name="Mapping Rule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>user</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>manager</nds-name>
Configuration avancée du pilote
51
Novell Confidential Manual (FRA) 28 October 2003
<app-name>manager</app-name>
</attr-name>
</attr-name-map>
</rule>
Les colonnes référentielles à valeur unique doivent pouvoir être égales à NULL.
Attributs référentiels à valeurs multiples
Deux tables parent peuvent être mises en relation grâce à une table enfant commune. Cette table enfant doit avoir une contrainte de clé étrangère qui pointe sur la clé primaire de chaque table parent. L’exemple suivant met en relation deux tables parent utilisateur
et groupe
par l’intermédiaire d’une table enfant commune membre
.
CREATE TABLE user
(
idu NUMBER(8) NOT NULL,
lname VARCHAR(64) NOT NULL,
CONSTRAINT pk_user_idu PRIMARY KEY(idu)
);
CREATE TABLE group
(
idg NUMBER(8) NOT NULL,
CONSTRAINT pk_group_idg PRIMARY KEY(idg)
);
CREATE TABLE member
(
idg NUMBER(8)NOT NULL,
idu NUMBER(8)NOT NULL,
CONSTRAINT fk_member_idg FOREIGN KEY(idg) REFERENCES
group(idg),
CONSTRAINT fk_member_idu FOREIGN KEY(idu) REFERENCES
user(idu)
);
<rule name="Mapping Rule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>user</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>Surname</nds-name>
<app-name>lname</app-name>
</attr-name>
<class-name>
<nds-name>Group</nds-name>
<app-name>group</app-name>
</class-name>
<attr-name class-name="Group">
<nds-name>Member</nds-name>
<app-name>member.idu</app-name>
</attr-name>
</attr-name-map>
</rule>
52
DirXML Driver for JDBC Implementation Guide (Guide d’implémentation du pilote DirXML pour JDBC)
Novell Confidential Manual (FRA) 28 October 2003
La première colonne contrainte dans une table enfant détermine la propriété. Dans l’exemple ci-dessus, membre
est considéré comme faisant partie de la classe groupe
. membre
est considéré comme étant un enfant propre de groupe
. La deuxième colonne contrainte dans une table enfant est l’attribut référentiel à valeurs multiples. Les deux colonnes doivent être contraintes
NOT NULL.
Dans l’exemple suivant, l’ordre des colonnes contraintes a été inversé pour que membre
soit une partie d’ utilisateur
. Pour mieux refléter cette relation, membre
a été renommée membre_de
.
CREATE TABLE user
(
idu NUMBER(8) NOT NULL,
lname VARCHAR(64) NOT NULL,
CONSTRAINT pk_user_idu PRIMARY KEY(idu)
);
CREATE TABLE group
(
idg NUMBER(8) NOT NULL,
CONSTRAINT pk_group_idg PRIMARY KEY(idg)
);
CREATE TABLE member_of
(
idu NUMBER(8)NOT NULL,
idg NUMBER(8)NOT NULL,
CONSTRAINT fk_member_idg FOREIGN KEY(idg) REFERENCES
group(idg),
CONSTRAINT fk_member_idu FOREIGN KEY(idu) REFERENCES
user(idu)
);
<rule name="Mapping Rule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>user</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>Surname</nds-name>
<app-name>lname</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Group Membership</nds-name>
<app-name>member_of.idg</app-name>
</attr-name>
<class-name>
<nds-name>Group</nds-name>
<app-name>group</app-name>
</class-name>
</attr-name-map>
</rule>
Configuration avancée du pilote
53
Novell Confidential Manual (FRA) 28 October 2003
Dans les bases de données dans lesquelles la position n’a aucune importance, l’ordre est déterminé par comparaison lexicographique.
En général, il est seulement nécessaire de synchroniser les attributs référentiels à valeurs multiples dans l’une ou l’autre classe, pas dans les deux. Pour synchroniser les attributs référentiels des deux classes, il faudrait construire deux tables enfant, une par classe. Si par exemple vous souhaitiez synchroniser Adhésion au groupe et Membre, vous auriez besoin de deux tables enfant : membre_de
et membre
.
En pratique, pour la synchronisation des objets Utilisateur et Groupe, nous vous recommandons de synchroniser l’attribut Adhésion au groupe de la classe Utilisateur au lieu de l’attribut Membre de la classe Groupe. Lorsque vous synchronisez Membre, des événements sont générés pour les utilisateurs non associés qui sont ajoutés à des groupes associés. Lorsque vous synchronisez
Adhésion au groupe, des événements ne sont générés que pour les utilisateurs associés qui sont ajoutés à des groupes associés.
Synchronisation directe
Dans un modèle de synchronisation directe, le pilote procède aux assignations suivantes :
Objet eDirectory
Classes
Attributs
1 classe
Attribut à valeur unique
Attribut à valeurs multiples
Objet Base de données
Vues
Afficher les colonnes
Vue
Afficher la colonne
Afficher la colonne
Une vue est une table logique. Contrairement aux tables parent ou enfant, elle n’existe pas physiquement dans la base de données. En tant que telles, les vues ne peuvent pas comporter de contraintes de clé primaire/clé étrangère. Pour indiquer au pilote les champs à utiliser lors de la génération de valeurs d’association, une ou plusieurs colonnes de vue doivent porter le préfixe pk_
(sans distinction majuscules/minuscules).
Remarque : les vues doivent être construites de telle sorte que les colonnes dotées du préfixe pk_
identifient une ligne de façon unique.
Les fonctionnalités de mise à jour des vues sont très variables selon les bases de données. La plupart des bases permettent une mise à jour des vues dans certaines conditions. Si les vues sont strictement en lecture seule, il est impossible de les utiliser pour l’acheminement des données via le canal Abonné. Sous Microsoft SQL Server 2000 et Oracle 8i et 9i, il est possible de définir une logique de mise à jour sur les vues dans instead-of-triggers, ce qui permet à une vue de joindre plusieurs tables tout en restant modifiable.
54
DirXML Driver for JDBC Implementation Guide (Guide d’implémentation du pilote DirXML pour JDBC)
Novell Confidential Manual (FRA) 28 October 2003
CREATE TABLE dirxml.emp
(
empno NUMERIC(8) NOT NULL UNIQUE,
fname VARCHAR(64),
lname VARCHAR(64),
pwdminlen NUMERIC(4),
phoneno VARCHAR(64)
);
CREATE VIEW dirxml.view_emp
(pk_empno, fname, lname, pwdminlen, phoneno)
AS
SELECT empno, fname, lname, pwdminlen, phoneno FROM dirxml.emp;
<rule name="MappingRule">
<attr-name-map>
<class-name>
<nds-name>User</nds-name>
<app-name>view_emp</app-name>
</class-name>
<attr-name class-name="User">
<nds-name>Given Name</nds-name>
<app-name>fname</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Surname</nds-name>
<app-name>lname</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Password Minimum Length</nds-name>
<app-name>pwdminlen</app-name>
</attr-name>
<attr-name class-name="User">
<nds-name>Telephone Number</nds-name>
<app-name>phoneno</app-name>
</attr-name>
</attr-name-map>
</rule>
Synchronisation des colonnes de clé primaire
Quand la base de données est la source experte de colonnes de clé primaire, celles-ci doivent généralement être omises des filtres Éditeur et Abonné, de la règle d’assignation de schéma et des déclencheurs de publication.
Quand eDirectory est la source experte de colonnes de clé primaire, celles-ci doivent généralement
être incluses dans le filtre Abonné et la règle d’assignation de schéma et omises du filtre Éditeur et des déclencheurs de publication. Il est également recommandé d’utiliser GUID plutôt que CN comme clé primaire. CN est à valeurs multiples et peut être modifié. GUID est à valeur unique et statique.
Configuration avancée du pilote
55
Novell Confidential Manual (FRA) 28 October 2003
Synchronisation de plusieurs classes
Lors de la synchronisation de plusieurs classes eDirectory, il est nécessaire de synchroniser chaque classe avec une table ou une vue parent différente. Chaque classe de base de données logique doit avoir un nom de colonne de clé primaire unique. Ce nom de colonne commun est utilisé par le canal Éditeur pour identifier toutes les lignes de la table de consignation des événements qui se rapportent à une classe de base de données logique unique. Ainsi, les classes de base de données logique utilisateur
et groupe
ont chacune un nom de colonne de clé primaire unique.
CREATE TABLE user
(
idu NUMBER(8) NOT NULL,
lname VARCHAR(64) NOT NULL,
CONSTRAINT pk_user_idu PRIMARY KEY(idu)
);
CREATE TABLE group
(
idg NUMBER(8) NOT NULL,
CONSTRAINT pk_group_idg PRIMARY KEY(idg)
);
Assignation d’attributs à valeurs multiples à des champs de base de données à valeur unique
Par défaut, le pilote suppose que tous les attributs eDirectory assignés aux colonnes d’une table parent ou d’une vue sont à valeur unique. Comme le pilote ne reconnaît pas le schéma eDirectory, il n’a aucun moyen de savoir si un attribut eDirectory est à valeur unique ou à valeurs multiples.
Par conséquent, les assignations d’attributs à valeur unique et à valeurs multiples sont traitées de la même manière.
Le pilote met en oeuvre l’algorithme MRT (Most Recently Touched - Modifié en dernier) vis-àvis des colonnes de table parent ou de vue à valeur unique. Un algorithme MRT garantit le stockage dans la base de données de la valeur d’attribut ajoutée ou supprimée en dernier. Cet algorithme fonctionne si l’attribut en question est à valeur unique et a des effets indésirables si l’attribut comporte plusieurs valeurs.
Lorsqu’une valeur est supprimée d’un attribut à valeurs multiples, le champ de base de données auquel elle est assignée sera défini comme vide (NULL) et le restera jusqu’à l’ajout d’une nouvelle valeur. Plusieurs solutions à ce comportement indésirable sont exposées ci-après.
La solution préférée consiste à élargir le schéma eDirectory afin que seuls des attributs à valeur unique soient assignés aux colonnes de table parent ou de vue.
Pour une synchronisation indirecte, assignez chaque attribut à valeurs multiples à sa propre table enfant.
Pour la synchronisation directe ou indirecte, utilisez des feuilles de style pour déterminer plusieurs valeurs avant de les insérer dans une colonne de table parent ou de vue.
56
DirXML Driver for JDBC Implementation Guide (Guide d’implémentation du pilote DirXML pour JDBC)

公開リンクが更新されました
あなたのチャットの公開リンクが更新されました。