OVH Cloud OVH Cloud

Piratage Mysql

37 réponses
Avatar
Frédéric ZULIAN
Bonjour,

Je viens de me faire pirater ma base de données MYSQL.
apache 2.2.19-2
mysql-server 5.1.58-1


Le petit plaisantin, qui m'a envoyé un mail pour m'avertir de son
« exploit » utilise win NT 5 avec HAVIJ v1.15.

Il a récupéré toute la base : Identifiant et mdp.

Du coût je n'ose plus redémarrer mon serveur.

Une idée de la parade ?

--

Frédéric
F1sxo



--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers debian-user-french-REQUEST@lists.debian.org
En cas de soucis, contactez EN ANGLAIS listmaster@lists.debian.org
Archive: http://lists.debian.org/20110915204121.GA11056@zulian.com

10 réponses

1 2 3 4
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 17/09/2011 14:50, Jean-Yves F. Barbier a écrit :
Je serais intéressé par un exemple, là comme ça je ne vois pas…



Bien essayé, mais pas tant que je n'ai pas fini et publié mon projet.



OK, je m'attendais à cette réponse =)

C'est pourtant relativement simple: ce que tu faisais dans php tu le fais
maintenant dans la PS, avec juste qq lignes de plus pour gérer ce type
d'indirection.



Pour moi, une PS, c'est ni plus ni moins que du SQL enrobé dans une méthode.
Si on commence à y intégrer du code métier, j'ai l'impression qu'on
s'éloigne très fortement de l'objectif des PS.

Là aussi, je bloque…



Les données sont totalement inaccessibles de l'extérieur sauf pour le SU de la
DB; seules les PS y ont accès, après contrôle des droits de l'appelant.



Oui, ça d'accord, mais les PS sont quand même ultra-limitées…
Elles ne supportent pas les arguments optionnels par exemple.
Comme je te l'ai mentionné, je ne vois pas comment on peut, via du PS,
arriver à faire ce genre de trucs (pseudo-code, et non sécuritaire je le
précise avant que ça n'hurle ^_^) :
function getTopics ( string[] sortOrders ) {
return "SELECT * FROM topics ORDER BY " + sortOrders.join(",");
}

Le fait d'avoir une requête SQL « dynamique » est pour moi en totale
contradiction avec le fonctionnement même des SP. Ou en tout cas, je ne
vois pas d'autres solutions que de faire :
function getTopics ( string[] sortOrders ) {
if sortOrders.is("date", "author")
return callSPGetTopicsOrderByDateAndAuthor()
else if sortOrders.is("date")
return callSPGetTopicsOrderByDate()
else if sortOrders.is("author")
return callSPGetTopicsOrderByAuthor()
else
return callSPGetTopics()
}
On voit bien l'explosion exponentielle du nombre de SP…

La seule solution que je puisse entrevoir serait de faire :
function getTopics ( string[] sortOrders ) {
return callSPGetTopicsGeneric(sortOrders)
}
ce qui reviendrait à faire descendre les contrôles de sécurité à la SP
au lieu du PHP, et en plus je n'ose trop imaginer la tronche finale de
la SP qui doit traiter TOUS les cas de requétage de l'application
(ordres de tri, colonnes remontées, jointures possibles (bonjour la
gestion de la sécurité avec les alias qui en découlent…), critères de
sélections…).

Non, le travail est égal, à moins bien sûr que tu n'utilise des trucs de
débutants comme SELECT * FROM matable au lieu de SELECT col1,col2,col6 FROM
matable.



Certes, le « SELECT * » n'est pas recommandé. Mais il a l'avantage de
permettre d'être justement indépendant des SDD derrière : si je modifie
ma table source, je n'ai pas à modifier ma requète !
Le fait de limiter la clause SELECT :
— bride l'application pour toute évolution future
— demande X requètes/SP si j'ai la même « requête »-métier mais avec
dans chaque cas un besoin de colonnes de sortie différent

Par exemple avec l'exemple des topics précédents, le fait de rajouter
une date de publication à un post par exemple, nécessite a minima
d'ajouter encore X stored-procs pour pouvoir gérer les filtres et les
tris sur cette colonne, de refondre Y stored-procs pour ajouter cette
date en données de sortie, etc.



Pas plus que dans du code extérieur.



Il est plus facile de modifier un fichier de mapping de l'ORM / modifier
ma classe de DAO / grepper dans mes fichiers PHP (dans l'ordre de
préférence) que de grepper dans une foultitude de SP.
Surtout que supprimer un champ dans une SP, ça va encore, « grep » le
verra. Mais difficile de grepper un champ qui n'existe pas encore parce
qu'on veut l'ajouter.

Et quid de la difficulté de s'assurer que les SP du serveur sont bien
celles attendues pour la version X, et pas celles de la version X-N ?

Dans ce cas (comme dans les autres), il *FAUT* faire signer au client un
cahier des charges exhaustif



Le cahier des charges était exhaustif pour chaque version.
On parle bien d'évolutions plusieurs mois après la mise en production.
Dans mon cas, il s'agissait d'un système de gestion de transactions
bancaires et l'évolution consistait à ajouter de nouveaux critères de
calcul (en gros des champs dans les tables, et là on a pleuré de ne pas
avoir mis de « SELECT * »…)

- ET avant tout se rappeler qu'un pro a le DEVOIR
(juridique!) de dire non à son client si ses desiderati sont farfelus.



À l'instant T0 de la signature du contrat, ils n'étaient pas farfelus.
À l'instant T0+18mois et 500 SP plus tard, ça l'est devenu un peu plus…

J'ai souvenir d'un ami a qui le commercial a refilé un dossier; après (courte)
analyse ce que voulait principalement le client se résumait à 30,000 hits à la
seconde...



Cas classique, mais à la réponse à un appel d'offre et avant la
signature du contrat, il est souvent difficile de voir tous les futurs
points de blocage, d'autant plus que le client se gardera bien de te
signaler ceux qu'il a déjà anticipés, et que toi tu es pressé par les
délais (4 jours pour répondre à un appel d'offre de 1.000 pages).

Ca m'a pris un temps fou en travail et réflexion pour trouver des solutions;
donc comme dit plus haut, pas de comm tant que mon projet n'est pas
terminé/publié (ce qui prendra le même temps... que le fût du canon pour
refroidir:).



J'imagine bien =)

Explique-moi la diff que tu vois entre entre des morceaux de php et
différentes PS?



Physiquement parlant, il n'y en a aucune, tout n'est que fichiers au final.
« Métièrement » parlant, un monde sépare les 2, d'autant plus si on sort
du monde PHP.
Je peux par exemple m'appuyer sur la POO (héritage, polymorphisme,
généricité, abstraction…) pour limiter la duplication, centraliser
l'information, factoriser mon code…
Un exemple à la con : il y a de fortes chances pour que le nom de mes
tables se trouvent à un seul endroit dans mon code, quand chaque SP
devra dupliquer l'information. Idem si j'ai 2 requêtes « identiques mais
pas tout à fait », fortes chances d'arriver à factoriser tout ça au
niveau code quand les SP feront un gros copié/collé de derrière les fagots.

Dans mon système, le MVC n'existe pas (en fait c'est la PS qui a ce rôle).



J'ai toujours du mal à voir comment.
Le but du MVC est d'obtenir une page quasi-HTML (ie. débarrasée de toute
présence de code métier) d'un côté et toute la récupération des données
de l'autre, de séparer la forme et le contenu en somme.
SP ou pas, ça n'a pas de rapport, ça ne reste que la partie M du MVC
(qui est ma DAO en JEE par exemple), il te manque encore toute la partie
C et V

Par ailleurs je reste persuadé que l'archi 3-tiers est très loin d'être une
panacée universelle; contrairement à ce que pense notamment la plupart des
programmeurs, notamment web.
Le 3-tiers est utile dans certains types d'applis bien particulières, pas dans
toutes.



Ça se prête généralement pas trop mal à tout type d'application.
Le gros avantage du N-tiers est de permettre des évolutions (métier,
physique ou technique) très faciles.
Je change de moteur de base sans rien faire. Je remplace ma DAO JPA par
une couche web-service ou tes SP en 10min. Je scallabilise ma couche
service en 30 min.

C'est comme pour les sites qui mettent 3' à charger la page de garde, ça n'est
pas parce qu'on a un quadri-CPU en dev qu'on ne doit pas penser à ceux qui
surfent avec un P3-500 - beaucoup, si ce n'est la plupart, devraient bien se
rentrer cela dans la tête.



Certes, mais en même temps, quand tu tapes dans une table de 2To, pas
sûr que le temps de chargement du navigateur soit celui à prendre en
compte =)

Evidemment, cela va à l'encontre de la mode actuelle où il faut pisser de la
ligne de code au kilomètre et où bien souvent on ne se pose la bonne question
que trop tard.



Là, le pissage de code au kilomètre, c'est clairement pas ma philosophie
non plus.
Je préfère 3 lignes qui fonctionnent, testées et validées, faites en 1
semaine, que 300 lignes hérétiques (que je me ferais une joie de
reverter !) en 2h !

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOdKaiAAoJEK8zQvxDY4P9+mIH/2we5Pw+VyWBUE/dBH1Rfgce
78XJOZpWkSBH7Xlzqu+IYlyIq+Z/zRQ09jdm8mscPAhLlS4NINWBoeWoWNAHWZI2
n8axYjHAFvaGCbIkwt9h5GQpJdOjsaw3azjjBPQEfZdcDiWdNhYmAE3Tu8l/9z9Z
m4SXZ5OjOrPLE5oYOZBTU9oQUPxUUI0k195DrBlDCGboQ+3kk6qZOs1A7GrPienJ
y7x4fb/+81KrVn+vUIp5/NAajkl85PmXG/U+3xDgSyL1wc4/AXCyzs6WDXYKf2NT
rAprOSbDrOedvPyDpZSNY48aPsjxGy4LAk57up7jT+5alwVmwzx/r4vbNtxaytc =WY10
-----END PGP SIGNATURE-----

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/4e74a6a7$0$7286$
Avatar
fabrice régnier
salut,

A mon avis et tout simplement:

Puisque tu utilises Apache, tu peux mettre en place une identification
ident/mdp avec .htaccess (htpasswd) au dessus de toutes tes applis web
(phpmyadmin, myphpscripts_bien_pourris, ...)

Tu dois autoriser le port 3306 que pour le localhost (si c'est possible).

Et puis (rien à voir avec ton problème actuel [mais surement futur ;) ]
) j'ai aussi vu que le port 22 était ouvert. Si c'est pour le sshd,
remplace le par le port 2201, ça va déjà calmer les robots.

Bon courage!

a+

f.



Le 15/09/2011 22:50, Frédéric ZULIAN a écrit :

Bonjour,

Je viens de me faire pirater ma base de données MYSQL.
apache 2.2.19-2
mysql-server 5.1.58-1


Le petit plaisantin, qui m'a envoyé un mail pour m'avertir de son
« exploit » utilise win NT 5 avec HAVIJ v1.15.

Il a récupéré toute la base : Identifiant et mdp.

Du coût je n'ose plus redémarrer mon serveur.

Une idée de la parade ?

--

Frédéric
F1sxo






--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/4e74b3ee$0$3943$
Avatar
Jean-Yves F. Barbier
On Sat, 17 Sep 2011 15:54:47 +0200, Aéris wrote:

...
Pour moi, une PS, c'est ni plus ni moins que du SQL enrobé dans une méthode.
Si on commence à y intégrer du code métier, j'ai l'impress ion qu'on
s'éloigne très fortement de l'objectif des PS.



Et c'est justement là que tu trompes: une PS ça *peut* être aussi simple qu'un
"SELECT col1,col2col3 FROM matable", mais c'est aussi et surtout capable de
beaucoup plus.
D'abord c'est écrit dans un langage structuré (SQL certes, mais a ussi Pl/pgSQL,
Pl/Python, Pl/LUA, Pl/C, etc), c'est en prise +/- directe avec les donnà ©es
(dépendant des droits d'exécution), mais c'est surtout intég ré directement dans
la DB, donc ça dépend des mécanismes de contrôle de la DB qui
sont /sensiblement/ plus élaborés que ceux de php (au hasard).

Ca permet aussi de remplacer certaines VIEWs trop complexes à manier/m odifier,
notamment en maintenance.

...
Oui, ça d'accord, mais les PS sont quand même ultra-limité es…



Archi faux: il faut bien comprendre qu'une PS, c'est du code (et pas n'impo rte
lequel: primairement orienté DB).

Elles ne supportent pas les arguments optionnels par exemple.



Encore archi faux: avec une PS on peut faire tout ce que l'on veut. Reste à
apprendre comment le faire ce qui n'est pas une mince affaire parce que
réflexion PGM ≠ réflexion DB.
J'ai mis presque une année à intégrer le fonctionnement, l'a nalyse et
l'application de tout ça à un résultat final parce que juste ment, même si ça
reste de la logique, elle est différent de celle de la programmation.

Ca n'est pas pour rien que les devs de gros projets sont complètement séparés
entre programmation et DB: ce ne sont pas les même métiers (un pe u comme
Erlang est totalement alien à celui qui ne fait que du Basic).

Comme je te l'ai mentionné, je ne vois pas comment on peut, via du P S,
arriver à faire ce genre de trucs (pseudo-code, et non sécurita ire je le
précise avant que ça n'hurle ^_^) :
function getTopics ( string[] sortOrders ) {
return "SELECT * FROM topics ORDER BY " + sortOrders.join(",");
}

Le fait d'avoir une requête SQL « dynamique » est pour moi en totale
contradiction avec le fonctionnement même des SP. Ou en tout cas, je ne
vois pas d'autres solutions que de faire :
function getTopics ( string[] sortOrders ) {
if sortOrders.is("date", "author")
return callSPGetTopicsOrderByDateAndAuthor()
else if sortOrders.is("date")
return callSPGetTopicsOrderByDate()
else if sortOrders.is("author")
return callSPGetTopicsOrderByAuthor()
else
return callSPGetTopics()
}
On voit bien l'explosion exponentielle du nombre de SP…



Mais si on fait (tjrs en symbolique):
CASE 1:
RETURN SORTED BY Date
CASE 2:
RETURN SORTED BY Author
CASE 4:
RETURN SORTED BY Date AND Author
DEFAULT:
RAISE ERROR maPSamoi, "Illegal sort switch"
END CASE

on n'a plus qu'une seule PS.

La seule solution que je puisse entrevoir serait de faire :
function getTopics ( string[] sortOrders ) {
return callSPGetTopicsGeneric(sortOrders)
}
ce qui reviendrait à faire descendre les contrôles de sécu rité à la SP
au lieu du PHP, et en plus je n'ose trop imaginer la tronche finale de
la SP qui doit traiter TOUS les cas de requétage de l'application
(ordres de tri, colonnes remontées, jointures possibles (bonjour la
gestion de la sécurité avec les alias qui en découlent⠀¦), critères de
sélections…).



D'abord il faut savoir si TOUS ces cas de tris ont une réelle lég itimité...
Ensuite les contrôles de sécurité DOIVENT setrouver là où la sécurité est
justement maximale, en l'occurence dans la DB.
Et pour terminer, absolument rien n'empêche d'avoir une PS qui renvoie un set
de records qui elle-même appelle une autre PS pour effectuer un autre
traitement.

Encore une fois: OÙ est la différence avec du code php morcellà ©??

...
Certes, le « SELECT * » n'est pas recommandé. Mais il a l' avantage de
permettre d'être justement indépendant des SDD derrière : si je modifie
ma table source, je n'ai pas à modifier ma requète !
Le fait de limiter la clause SELECT :
— bride l'application pour toute évolution future
— demande X requètes/SP si j'ai la même « requà ªte »-métier mais avec
dans chaque cas un besoin de colonnes de sortie différent



C'est justement pour cela que j'appelle ça une erreur de débutant:
1- Rien dans les différents normatifs SQL ne garantie l'ordre de retou r des
données (col1,col2,col3 ou col2,col3,col1 ou...) et c'est ce qui d éconseille
formellement le '*',
2- Rien n'empêche d'avoir lesdites colonnes en paramètres de la P S,
3- À partir du moment où l'on a compris que la bonne syntaxe est de
nommer et ordonner les colonnes dans la requête, la maintenance d'u n code
qu'il soit interne ou externe est strictement la même.

Encore une fois, c'est là que l'on voit les différences (profonde s) entre
réflexion de programmation et réflexion DB.

...
Il est plus facile de modifier un fichier de mapping de l'ORM / modifier
ma classe de DAO / grepper dans mes fichiers PHP (dans l'ordre de
préférence) que de grepper dans une foultitude de SP.



Dans l'état actuel des choses, un ORM est une ineptie - tout au plus p eut il
servir lors d'une phase de mise au point.
Pourquoi en rajouter une couche (qui ralentit fortement l'ensemble) alors
qu'une bonne conception évite cela??

Surtout que supprimer un champ dans une SP, ça va encore, « gre p » le
verra. Mais difficile de grepper un champ qui n'existe pas encore parce
qu'on veut l'ajouter.



Comme dit plus haut, il suffit qu'il soit donné en parm à la PS.

Et quid de la difficulté de s'assurer que les SP du serveur sont bien
celles attendues pour la version X, et pas celles de la version X-N ?



Là, je ne veux pas être méchant mais si tu distribues une M àJ du code php sans
celle de la DB, faut changer de métier tout de suite: c'est un tout.

> Dans ce cas (comme dans les autres), il *FAUT* faire signer au client un
> cahier des charges exhaustif

Le cahier des charges était exhaustif pour chaque version.
On parle bien d'évolutions plusieurs mois après la mise en prod uction.



Les prospectives AUSSI doivent être évoquées - et cela à   tous les niveaux: que
cela soit avec les informaticiens locaux, les utilisateurs, les cadres et l es
décideurs; c'est la seule façon d'obtenir une vue d'ensemble de l a chose et
d'éviter les télescopages entre les désirs des uns et les im pératifs des
autres.
Ca évite une bonne partie des mauvaises surprises futures.

Dans mon cas, il s'agissait d'un système de gestion de transactions
bancaires et l'évolution consistait à ajouter de nouveaux crit ères de
calcul (en gros des champs dans les tables, et là on a pleuré d e ne pas
avoir mis de « SELECT * »…)



V. plus haut.
Et dans une PS, il est excessivement facile de renvoyer un champ calculà © (pour
peu, bien sûr, qu'on ait les bonnes colonnes déjà existantes ).

> - ET avant tout se rappeler qu'un pro a le DEVOIR
> (juridique!) de dire non à son client si ses desiderati sont farfe lus.

À l'instant T0 de la signature du contrat, ils n'étaient pas fa rfelus.
À l'instant T0+18mois et 500 SP plus tard, ça l'est devenu un p eu plus…



Là il ne peut y avoir que 2 poss: soit l'analyse a été mal f aite, soit le
client n'a pas été clair (voire un peu des 2).
Pour ce qui est de la clarté, un client c'est comme un clébard: ça s'éduque;
une façon simple de faire est de lui expliquer que ce que LUI consid ère comme
une modif triviale peut prendre une semaine de boulot, alors que ce qu'il
considère comme extrêmement compliqué peut dès fois à ªtre réalisé en moins
d'une heure.
Mais dans le cas présent, je soupçonne fortement (et à prior i) un défaut de
conception de la DB.

> J'ai souvenir d'un ami a qui le commercial a refilé un dossier; ap rès
> (courte) analyse ce que voulait principalement le client se résuma it à
> 30,000 hits à la seconde...

Cas classique, mais à la réponse à un appel d'offre et ava nt la
signature du contrat, il est souvent difficile de voir tous les futurs
points de blocage, d'autant plus que le client se gardera bien de te
signaler ceux qu'il a déjà anticipés,



Les clauses réservatives sont là pour ça, d'ailleurs un cont rat sur appel
d'offre ne devrait *jamais* être signé sans l'approbation d'un ca binet
d'avocat spécialisé.

et que toi tu es pressé par les délais (4 jours pour répon dre à un appel
d'offre de 1.000 pages).



Et pourquoi pas 24H tant qu'on y est!?
Si vous répondez à n'importe quoi en 6 secondes 22 il ne faut pas venir se
lamenter après que le client n'a pas dit çi ou ça.

...
> Explique-moi la diff que tu vois entre entre des morceaux de php et
> différentes PS?

Physiquement parlant, il n'y en a aucune, tout n'est que fichiers au fina l.
« Métièrement » parlant, un monde sépare les 2, d'autant plus si on sort
du monde PHP.
Je peux par exemple m'appuyer sur la POO (héritage, polymorphisme,
généricité, abstraction…) pour limiter la duplicat ion, centraliser
l'information, factoriser mon code…



O_o tu fais de la POO en php...

Un exemple à la con : il y a de fortes chances pour que le nom de mes
tables se trouvent à un seul endroit dans mon code, quand chaque SP
devra dupliquer l'information. Idem si j'ai 2 requêtes « identi ques mais
pas tout à fait », fortes chances d'arriver à factoriser t out ça au
niveau code quand les SP feront un gros copié/collé de derrià ¨re les fagots.



Et si le nom de la table n'était qu'un parm d'appel de la PS?
Voila une idée qu'elle est bonne! (et qu'elle permet de réutilise r la PS avec
d'autres tables).

> Dans mon système, le MVC n'existe pas (en fait c'est la PS qui a c e rôle).

J'ai toujours du mal à voir comment.
Le but du MVC est d'obtenir une page quasi-HTML (ie. débarrasée de toute
présence de code métier) d'un côté et toute la rà ©cupération des données
de l'autre, de séparer la forme et le contenu en somme.
SP ou pas, ça n'a pas de rapport, ça ne reste que la partie M d u MVC
(qui est ma DAO en JEE par exemple), il te manque encore toute la partie
C et V



Quelle est la différence entre mettre en page du code qui vient d'une requête
en php et celui qui vient d'une PS; perso, j'vois pas (partie V).

Pour la partie C, elle est aussi incluse dans la PS.

> Par ailleurs je reste persuadé que l'archi 3-tiers est très l oin d'être une
> panacée universelle; contrairement à ce que pense notamment l a plupart des
> programmeurs, notamment web.
> Le 3-tiers est utile dans certains types d'applis bien particulièr es, pas
> dans toutes.

Ça se prête généralement pas trop mal à tout typ e d'application.
Le gros avantage du N-tiers est de permettre des évolutions (mé tier,
physique ou technique) très faciles.
Je change de moteur de base sans rien faire. Je remplace ma DAO JPA par
une couche web-service ou tes SP en 10min. Je scallabilise ma couche
service en 30 min.



Moi aussi j'aime bien les Lego, mais c'est pas avec ça que je construi rais ma
baraque...
Plus sérieusement, ces outils ont été développés p our des raisons et des
besoins particuliers, PAS pour être mis à toutes les sauces.

Chaque outil a ses propres spécificités; par exemple tu peux fair e tout ce que
tu veux en N-tiers en matière de communications, mais je te mettrais t oujours
une pallée en utilisant Erlang et en scalant mon système en 3 lig nes de code
sur un nombre illimité de nodes en qq secondes.

La bonne question c'est: est-ce qu'utiliser ceci ou cela apporte vraiment de
l'eau au moulin ou est-ce juste un pis aller pour aller plus vite (en Gal au
détriment de l'évolution).

Un tout ch'tit exemple: tu dis "Je change de moteur de base sans rien faire"
sauf que chaque DB a certaines spécifités et que certaines, mà ªme hors normes
SQL, facilitent grandement la vie.
Un autre: ça ne me viendrait même pas à l'esprit ne serait-c e qu'envisager
d'éventuellement un jour peut-être de penser à mysql pour un e appli sérieuse.

> C'est comme pour les sites qui mettent 3' à charger la page de gar de, ça
> n'est pas parce qu'on a un quadri-CPU en dev qu'on ne doit pas penser à
> ceux qui surfent avec un P3-500 - beaucoup, si ce n'est la plupart,
> devraient bien se rentrer cela dans la tête.

Certes, mais en même temps, quand tu tapes dans une table de 2To, pas
sûr que le temps de chargement du navigateur soit celui à prend re en
compte =)



Quand bien même la table ferait 2T *rows*, c'est juste une question de
conception correcte de la DB, de ses indexes, de ses PS et de ses requà ªtes
(considérant que le hard a été au préalable correctemen t dimensionné).

--
Is this really happening?

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 17/09/2011 17:20, fabrice régnier a écrit :
Tu dois autoriser le port 3306 que pour le localhost (si c'est possible).



Même mieux, sauf raisons particulières (VPN…), la conf de MySQL ne
devrait écouter que sur lo !

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOdL7AAAoJEK8zQvxDY4P9DWAIALFIXJfVZDduPk5/7jJTUgNg
JNm+XrMHeM8S79fOp2eUkbjZtgvoVlutq2wA3o1KooJEo8DfXtvP9HAks9PYwvFx
xnpMbwuBnnVKDzS2nUjenpryZm847d5LDTUfiWl9gZEFM3W3NsG4V/4AbiZIpbTt
qfJjPmIgF2pcl2u13rnv9cawci8bJuM8t4TJiqiVnTwuRwoBLxMBN96k4xmVoeJi
KAT3r+D5Noay+fHtU8W87ryhEQVQ6yuSnfg45idrbcScXp30OZkqevlugX70WSrL
MJljEveAp/GFc6lykCEBZMTwk7rf5GHIugo2aM61hw7NspsILjPbUwgx00SqNys =zh4F
-----END PGP SIGNATURE-----

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/4e74bec5$0$16420$
Avatar
Nicolas KOWALSKI
On Sat, Sep 17, 2011 at 02:59:03PM +0200, Jean-Yves F. Barbier wrote:
Pour faire court: php a pillé perl; perl n'est pas un mauvais langage mais
tout comme C il permet le plus agréable des codes comme le plus illisible
et pourri possible.



Je plussoie cette remarque.

J'ai eu l'occasion de faire du Perl pour de la supervision (mon) et de
l'analyse de logs (issus de mon); on peut faire des choses propres,
ultra-rapides, avec des sorties en HTML nickel (passées au validator w3c
les doigts dans le nez). Pour les sorties achtéaimelle, j'ai en
particulier beaucoup apprécié le module CGI, pour lequel je n'ai pas
trouvé d'équivalent PHP ; on code en Perl, pas en HTML, et le module
fait le nécessaire pour retranscrire le tout proprement.

--
Nicolas

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 17/09/2011 17:50, Jean-Yves F. Barbier a écrit :
Et c'est justement là que tu trompes: une PS ça *peut* être aussi simple qu'un
"SELECT col1,col2col3 FROM matable", mais c'est aussi et surtout capable de
beaucoup plus.
D'abord c'est écrit dans un langage structuré (SQL certes, mais aussi Pl/pgSQL,
Pl/Python, Pl/LUA, Pl/C, etc), c'est en prise +/- directe avec les données
(dépendant des droits d'exécution), mais c'est surtout intégré directement dans
la DB, donc ça dépend des mécanismes de contrôle de la DB qui
sont /sensiblement/ plus élaborés que ceux de php (au hasard).



OK, mais on sort totalement du cadre des procédures stockées lambda…
Et entre mettre du code dans la db ou du code dans l'appli, pour moi
c'est du pareil au même, et sauf à demander 2× plus de travail et de
personnes, je n'en vois pas l'intérêt.
Bien que je ne maîtrise pas ce que permet de telles SP au niveau
sécurité DB, j'imagine assez mal ne pas pouvoir faire ce type de
contrôle au niveau applicatif. Peut-être me trompé-je…
Et qui dit 2 sources de code dit 2× plus de risque d'erreur !

Ca permet aussi de remplacer certaines VIEWs trop complexes à manier/modifier,
notamment en maintenance.



Là je te suis parfaitement, c'est d'ailleurs une des utilisations que
j'en ai, avec le traitement de procédures trop longues ou inefficaces
côté applicatif.

J'ai mis presque une année à intégrer le fonctionnement, l'analyse et
l'application de tout ça à un résultat final parce que justement, même si ça
reste de la logique, elle est différent de celle de la programmation.



Gros problème que j'y vois : cette manière de penser (que j'imagine bien
loin de tout standard SQL et reposant sur des API propres au moteur
utilisé), est totalement non portable, réutilisable ou généralisable.
Tu changes de moteur, ton année de travail aura été totalement vain.

Ca n'est pas pour rien que les devs de gros projets sont complètement séparés
entre programmation et DB: ce ne sont pas les même métiers (un peu comme
Erlang est totalement alien à celui qui ne fait que du Basic).



Euh, sur de gros projets, les DBA s'occupent de la structuration des
données (schémas, indexes, configuration et paramétrage du moteur…), pas
du développement…


Mais si on fait (tjrs en symbolique):
CASE 1:
RETURN SORTED BY Date
CASE 2:
RETURN SORTED BY Author
CASE 4:
RETURN SORTED BY Date AND Author
DEFAULT:
RAISE ERROR maPSamoi, "Illegal sort switch"
END CASE

on n'a plus qu'une seule PS.



C'est effectivement la solution que j'envisageait.
Mais dans une application classique, je pense que N tend plus vers 200
que vers 5…

D'abord il faut savoir si TOUS ces cas de tris ont une réelle légitimité...



Dans une application « classique », oui.
Par exemple dans les écrans de reporting et/ou de traçabilité.

Ensuite les contrôles de sécurité DOIVENT setrouver là où la sécurité est
justement maximale, en l'occurence dans la DB.



Pas convaincu…
J'ai l'exemple d'une de mes applis de gestion biométriques où les
données nominatives n'étaient accessibles que par les admins du système.
Une partie du contrôle des accès aux colonnes de la db était donc à
faire au niveau applicatif !

C'est justement pour cela que j'appelle ça une erreur de débutant:
1- Rien dans les différents normatifs SQL ne garantie l'ordre de retour des
données (col1,col2,col3 ou col2,col3,col1 ou...) et c'est ce qui déconseille
formellement le '*',



C'est pour ça que je n'utilise pas le positionnel, mais bien les champs
nommés.

2- Rien n'empêche d'avoir lesdites colonnes en paramètres de la PS,



Ce qui ouvre la voie à de l'injection SQL ? =)

3- À partir du moment où l'on a compris que la bonne syntaxe est de
nommer et ordonner les colonnes dans la requête, la maintenance d'un code
qu'il soit interne ou externe est strictement la même.



+1 aussi là, mais pas de rapport avec les SP

Dans l'état actuel des choses, un ORM est une ineptie - tout au plus peut il
servir lors d'une phase de mise au point.
Pourquoi en rajouter une couche (qui ralentit fortement l'ensemble) alors
qu'une bonne conception évite cela??



Un ORM, c'est pas juste un bidule qui te connecte à la base…
Ça t'apporte pas mal d'autres choses, comme les pools de connexion, les
caches multi-niveaux, l'indépendance du moteur…
Par exemple avec Hibernate, je vais utiliser à plein les principes de
localité temporelle et spatiale et économiser un maximum de requêtes
superflues grâce aux caches.

Là, je ne veux pas être méchant mais si tu distribues une MàJ du code php sans
celle de la DB, faut changer de métier tout de suite: c'est un tout.



Si le monde était aussi rose, ça se saurait depuis longtemps =)
Et je peux très facilement vérifier que mon client a exactement les
mêmes fichiers que moi en production (MD5), il en est autrement pour les
SP potentielles sur le moteur…

Les prospectives AUSSI doivent être évoquées - et cela à tous les niveaux: que
cela soit avec les informaticiens locaux, les utilisateurs, les cadres et les
décideurs; c'est la seule façon d'obtenir une vue d'ensemble de la chose et
d'éviter les télescopages entre les désirs des uns et les impératifs des
autres.
Ca évite une bonne partie des mauvaises surprises futures.



Un client a souvent du mal à définir son futur, surtout à 18 ou 30 mois.
J'ai même dans mon entreprise des demandes d'évolution sur du soft de 30
ans d'âge !

Là il ne peut y avoir que 2 poss: soit l'analyse a été mal faite, soit le
client n'a pas été clair (voire un peu des 2).



Non, juste que tout faire en SP ne nous semblait pas impossible
techniquement, et reste d'ailleurs même encore aujourd'hui complètement
faisable.
Le soucis est venu au cours du développement, quand on a commencé à voir
le nombre de SP, avec X variantes de la même requête, mais avec plus ou
moins de données sortantes, de critères de sélection ou de tri…
Les développeurs s'arrachaient la tête pour savoir si une fonctionnalité
avait déjà été SPifié ou si le travail restait à faire, pour trouver
telle SP qui devait être corrigée, ainsi que toutes ses variations
potentielles.

Mais dans le cas présent, je soupçonne fortement (et à priori) un défaut de
conception de la DB.



C'était le cas en partie, mais la base avait été héritée d'un ancien
système et on ne pouvait pas trop y toucher.
Et pour achever le coup des SP, la plupart des requêtes étaient
dépendantes d'un fichier de conf (XML) qui définissaient les règles
métiers (répartition fonction du client, taxes variables, frais,
ristournes commerciales…).
Le nombre de paramètres à passer aux SPs étaient effroyables (jusqu'à
300 paramètres pour la plus grosse de mémoire).

Les clauses réservatives sont là pour ça, d'ailleurs un contrat sur appel
d'offre ne devrait *jamais* être signé sans l'approbation d'un cabinet
d'avocat spécialisé.



Les clauses sont là, mais rarement appliquées.

Physiquement parlant, il n'y en a aucune, tout n'est que fichiers au final.
« Métièrement » parlant, un monde sépare les 2, d'autant plus si on sort
du monde PHP.



O_o tu fais de la POO en php...



Heureusement que j'ai bien précisé « d'autant plus si on sort du monde PHP »

Et si le nom de la table n'était qu'un parm d'appel de la PS?
Voila une idée qu'elle est bonne! (et qu'elle permet de réutiliser la PS avec
d'autres tables).



Et de redescendre l'injection SQL un poil plus bas…

Quelle est la différence entre mettre en page du code qui vient d'une requête
en php et celui qui vient d'une PS; perso, j'vois pas (partie V).



Aucune, c'est bien pour ça que à V identique (template, JSP…), c'est
uniquement le M qui différera (JPA dans mon cas, SP dans le tient).
Et donc la V n'a *RIEN À FAIRE* dans le moteur.
Pire, c'est même contraire à la philosophie MVC qui stipule qu'on doit
pouvoir changer de vue voire en avoir plusieurs pour un même M.
Si demain je veux mettre des web-services ou faire une appli lourde au
lieu de mon appli web, je n'ai théoriquement que le V à changer et un
peu le C, le M reste *STRICTEMENT* le même.

Pour la partie C, elle est aussi incluse dans la PS.



Gné ?
Ça devient limite de l'hérésie là…
Le jour où je rajoute des écrans, je dois toucher à ma BdD ? Oo

Chaque outil a ses propres spécificités; par exemple tu peux faire tout ce que
tu veux en N-tiers en matière de communications, mais je te mettrais toujours
une pallée en utilisant Erlang et en scalant mon système en 3 lignes de code
sur un nombre illimité de nodes en qq secondes.



Certes, mais qui pourra maintenir ton code derrière ?
Non pas que je défende qu'on doit pouvoir refiler la reprise de code au
premier venu, mais à l'inverse, s'il faut que la recrue mette la même
année que toi à comprendre le langage / système…

La bonne question c'est: est-ce qu'utiliser ceci ou cela apporte vraiment de
l'eau au moulin ou est-ce juste un pis aller pour aller plus vite (en Gal au
détriment de l'évolution).



Oui, à long terme.
On sait d'avance que les évolutions seront nombreuses (surtout dans mon
domaine principal, l'industrie), et les équipes très fluctuantes (SSII).
Le soft se doit d'être abordable tout en étant suffisamment bien gaulé.

Un tout ch'tit exemple: tu dis "Je change de moteur de base sans rien faire"
sauf que chaque DB a certaines spécifités et que certaines, même hors normes
SQL, facilitent grandement la vie.



C'est pour ça que Hibernate définit la notion de dialecte et se base sur
les API propres à chaque moteur (non pas comme certains le pense en se
conformant à la stricte norme SQL).
Il utilisera par exemple les serial et séquences de PostgreSQL au lieu
de l'auto-incrément MySQL.

Un autre: ça ne me viendrait même pas à l'esprit ne serait-ce qu'envisager
d'éventuellement un jour peut-être de penser à mysql pour une appli sérieuse.



C'est bien pour ça que je l'ai fait bannir de notre bureau d'études.
Comme remplaçant, PostgreSQL !

Quand bien même la table ferait 2T *rows*, c'est juste une question de
conception correcte de la DB, de ses indexes, de ses PS et de ses requêtes
(considérant que le hard a été au préalable correctement dimensionné).



Oui, et ça c'est le taff du DBA.
Mais même tout ça bien calibré, les millisecondes de latence du
navigateur seront pinuts comparées à la bonne grosse seconde de calcul…

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOdN6TAAoJEK8zQvxDY4P93NUH/ieps2F58INYIuaVPfXYq5FR
fCETFxK2xY0HXnI3BJ54/0iXpRhC4dMvrZAME6dJjpqT6ssercedH8YIrDUO5sEp
poy0FvAf/+WnGf4qymLbQYWaePW/0EcEYvL3mJQhgURnqnwXaEguSkKkVOZk7yuQ
h+2wTNIwXEWqNR4qG1o7rYUJZJS4Rnz+iRZG+KG02Zj+L1Ym3Tivg8cVOQRFIw+P
re5Jtq0LONBlyLmWsiAizcMP30hq6xCPx4ohft/ldaHx6hJYE8oY9boo4S4TbFip
I6ebU19hwGpdN6+oXBjMJGq84nprKGV6S8KocdhSzK/JHbV4lsgSTyj9x60D/Aw Ï4T
-----END PGP SIGNATURE-----

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/4e74de9a$0$12804$
Avatar
Jean-Yves F. Barbier
On Sat, 17 Sep 2011 19:53:30 +0200, Aéris wrote:

...
OK, mais on sort totalement du cadre des procédures stockées la mbda…



Tout dépend de la conception de lambda; dans le cas présent, il s 'agit de
répartir les tâches équitablement entre codes int/ext.

Et entre mettre du code dans la db ou du code dans l'appli, pour moi
c'est du pareil au même, et sauf à demander 2× plus de tra vail et de
personnes, je n'en vois pas l'intérêt.



Chacun chez soi...
Autrement dit pourquoi chercher à gérer la sécu des accà ¨s au niveau applicatif
alors que c'est déjà intégré dans la DB!?

Bien que je ne maîtrise pas ce que permet de telles SP au niveau
sécurité DB, j'imagine assez mal ne pas pouvoir faire ce type de
contrôle au niveau applicatif. Peut-être me trompé-je⠀¦



Avec l'apparition de Pg ≥ 9.0 le contrôle est devenu bcp plus fin (colonnes),
il me parait donc logique que la DB s'occupe du contrôle d'accès.

Par rapport à Oracle, il manque encore qq autres contrôles, mais à la vitesse
(ET surtout la qualité) à laquelle les devs Pg vont, je ne doute pas que d'ici
la fin de l'année prochaine on y soit.

Et qui dit 2 sources de code dit 2× plus de risque d'erreur !



Nan: ça revient au même, la différence c'est que le code ext n'exécute plus
qu'un simple appel à la SP.

...
> J'ai mis presque une année à intégrer le fonctionnement, l'analyse et
> l'application de tout ça à un résultat final parce que j ustement, même si
> ça reste de la logique, elle est différent de celle de la pro grammation.

Gros problème que j'y vois : cette manière de penser (que j'ima gine bien
loin de tout standard SQL et reposant sur des API propres au moteur
utilisé), est totalement non portable, réutilisable ou gén éralisable.
Tu changes de moteur, ton année de travail aura été totale ment vain.



C'est en partie vrai, mais depuis qq temps on observe une convergence, Ã   mon
avis non-fortuite, entre Pg & Oracle; et il n'y a pas tant que cela d'autres
compétiteurs du même niveau.
C'est pour cela que j'essaye de penser hors des sentiers battus; la
portabilité c'est Tbien dans l'abstrait, mais encore faut-il:
* qu'il y ait un intérêt quelconque à éventuellement sw itcher,
* qu'il existe un moteur capable de rendre les même services.
* que ladite portabilité ne se fasse pas au détriment des perfs.

> Ca n'est pas pour rien que les devs de gros projets sont complètem ent
> séparés entre programmation et DB: ce ne sont pas les mê me métiers (un peu
> comme Erlang est totalement alien à celui qui ne fait que du Basic ).

Euh, sur de gros projets, les DBA s'occupent de la structuration des
données (schémas, indexes, configuration et paramétrage du moteur…), pas
du développement…



Ben ceux que je connais sont en Gal aussi des devs, justement parce que c'e st
une discipline très différente de la programmation proprement dit e.

> Mais si on fait (tjrs en symbolique):
> CASE 1:
> RETURN SORTED BY Date
> CASE 2:
> RETURN SORTED BY Author
> CASE 4:
> RETURN SORTED BY Date AND Author
> DEFAULT:
> RAISE ERROR maPSamoi, "Illegal sort switch"
> END CASE
>
> on n'a plus qu'une seule PS.

C'est effectivement la solution que j'envisageait.
Mais dans une application classique, je pense que N tend plus vers 200
que vers 5…



Même si N00 ça ne pose pas de PB insoluble (surtout que dans Pg, une fois
passé le premier appel qui déclenche la compilation, c'est le pse udo-code qui
est exécuté).

> D'abord il faut savoir si TOUS ces cas de tris ont une réelle là ©gitimité...

Dans une application « classique », oui.
Par exemple dans les écrans de reporting et/ou de traçabilità ©.



Eventuellement pour la traçabilité, mais normalement si la DB est bien concue
ça se traite par une table 1-1-self (et par voie de conséquence, par des appels
récursifs à la SP).
Pour le reporting c'est une toute autre histoire, notamment dans les grosses
entreprises, parce que toutes les enquêtes montrent que chaque nouveau chef
vient ajouter son grain de… sable dans la machine pour prouver qu'i l existe,
mais qu'au final moins de 10% des traitements de données (en Gal les
indicateurs std) servent réellement à qq chose dans les processus de
décision/optimisation.

> Ensuite les contrôles de sécurité DOIVENT setrouver là   où la sécurité est
> justement maximale, en l'occurence dans la DB.

Pas convaincu…
J'ai l'exemple d'une de mes applis de gestion biométriques où l es
données nominatives n'étaient accessibles que par les admins du système.
Une partie du contrôle des accès aux colonnes de la db éta it donc à
faire au niveau applicatif !



Développe un peu plus parce que là je ne vois pas le tableau.

> C'est justement pour cela que j'appelle ça une erreur de débu tant:
> 1- Rien dans les différents normatifs SQL ne garantie l'ordre de r etour des
> données (col1,col2,col3 ou col2,col3,col1 ou...) et c'est ce qui
> déconseille formellement le '*',

C'est pour ça que je n'utilise pas le positionnel, mais bien les cha mps
nommés.



Ca n'est point ce que j'avions lû qq posts plus haut, gent damoiseau!:
"Certes, le « SELECT * » n'est pas recommandé. Mais il a l'a vantage de
permettre d'être justement indépendant des SDD derrière : si je modifie
ma table source, je n'ai pas à modifier ma requète !" SIC

> 2- Rien n'empêche d'avoir lesdites colonnes en paramètres de la PS,

Ce qui ouvre la voie à de l'injection SQL ? =)



Pas du tout, il existe des mécanismes simples dans Pg pour se pré valoir de
toute possibilité d'injection par les parms d'une SP.

...
> Dans l'état actuel des choses, un ORM est une ineptie - tout au pl us peut
> il servir lors d'une phase de mise au point.
> Pourquoi en rajouter une couche (qui ralentit fortement l'ensemble) alo rs
> qu'une bonne conception évite cela??

Un ORM, c'est pas juste un bidule qui te connecte à la base…
Ça t'apporte pas mal d'autres choses, comme les pools de connexion, les
caches multi-niveaux, l'indépendance du moteur…



Si j'ai besoin de pools et/ou de cache(s), je vais les chercher
individuellement là où ils sont 100% fonctionnels et très pe rformants, pas
dans une soupe où l'on trouve tout et n'importe quoi - souvent bricol és à la
va-vite sur demande pressante des utilisateurs.

...
> Là, je ne veux pas être méchant mais si tu distribues un e MàJ du code php
> sans celle de la DB, faut changer de métier tout de suite: c'est u n tout.

Si le monde était aussi rose, ça se saurait depuis longtemps =)
Et je peux très facilement vérifier que mon client a exactement les
mêmes fichiers que moi en production (MD5), il en est autrement pour les
SP potentielles sur le moteur…



D'où l'intérêt d'upgrader par package complet - sinon il suf fit d'ajouter une
SP qui renvoie la version (mais ça reste une Tmauvaise solution).

...
Un client a souvent du mal à définir son futur, surtout à 18 ou 30 mois.



J'entends bien, mais dans ce cas il faut être aussi clair dans l'autre sens:
soit il aura un soft très spécialisé et totalement adaptà © à son cas présent
(mais qui demandera plus de travail lors d'une évolution), soit tu lui fais
un truc extrêmement malléable avec ORM, N-tiers et tout le toutim , au
détriment complet des perfs (mais qui se modifiera très facilemen t).
A ma connaissance dans ce domaine, il est totalement impossible d'avoir le
beurre, l'argent du beurre et le cul de la fermière (cochonne qui a de s gros…,
ha non, merde, c'est l'infirmière:)

J'ai même dans mon entreprise des demandes d'évolution sur du s oft de 30
ans d'âge !



Je pense que ça mérite une analyse poussée au cas par cas; j 'ai pu jeter de
temps en temps un œil a certains vieux softs qui étaient terrible ment bien
faits, alors que d'autres étaient une vraie cata.

> Là il ne peut y avoir que 2 poss: soit l'analyse a été m al faite, soit le
> client n'a pas été clair (voire un peu des 2).

Non, juste que tout faire en SP ne nous semblait pas impossible
techniquement, et reste d'ailleurs même encore aujourd'hui complà ¨tement
faisable.
Le soucis est venu au cours du développement, quand on a commencà © à voir
le nombre de SP, avec X variantes de la même requête, mais avec plus ou
moins de données sortantes, de critères de sélection ou de tri…



Apparemment mauvaise analyse dûe à une connaissance pas assez app rofondie de
la DB utilisée.

Les développeurs s'arrachaient la tête pour savoir si une fonct ionnalité
avait déjà été SPifié ou si le travail restait à faire, pour trouver
telle SP qui devait être corrigée, ainsi que toutes ses variati ons
potentielles.



Dans ce cas, fais les passer en AGILE ou XP - je ne sais plus lequel proc ède
par releases rapides, mais c'est un système qui a bcp d'avantages: rel ease
when ready AND tested, puis ajouts de fonctionnalités par releases, ju squ'à
release 1.0

> Mais dans le cas présent, je soupçonne fortement (et à p riori) un défaut de
> conception de la DB.

C'était le cas en partie, mais la base avait été héri tée d'un ancien
système et on ne pouvait pas trop y toucher.



Ha haaaa, la vieille base qu'on ne peut pas toucher - un must du classique!
C'est aussi là que la préparation pêche: soit le client cons erve sa base et il
encaisse *également* les inconvénients qui vont avec, soit il y a migration
et donc création d'une Nlle base.
Parce que si tu réponds oui à une telle demande, la première merde te reviendra
dans le museau comme un boomerang (les clients ont l'amnésie absolue q uand il
s'agit de responsabilité).
Là encore, c'est une question d'analyse préalable - prendre un ma rché, c'est
bien, mais pas s'il doit se transformer en sables mouvants dès le dev.

Et pour achever le coup des SP, la plupart des requêtes étaient
dépendantes d'un fichier de conf (XML) qui définissaient les r ègles
métiers (répartition fonction du client, taxes variables, frais,
ristournes commerciales…).



Là encore c'est un défaut d'analyse: comment accepter des donnà ©es externes
alors qu'elles auraient dû se trouver dans la DB?

Pour te donner une idée, même les tailles & positionnements des f enêtres de mon
projet sont stockés dans la DB.

Une fois que c'est fait, on définit une ligne de process par taxe/rist ourne/etc
puis les SP qui vont bien, puis la SP qui chapeaute le tout (SI il y en a
vraiment besoin, par qu'il est facile d'automatiser ce type de traitement en
chaînant les SP d'une façon transparente).

Le nombre de paramètres à passer aux SPs étaient effroyabl es (jusqu'à
300 paramètres pour la plus grosse de mémoire).



Ca me parait, là encore, relever d'une erreur de conception liée au §
ci-dessus.

> Les clauses réservatives sont là pour ça, d'ailleurs un contrat sur appel
> d'offre ne devrait *jamais* être signé sans l'approbation d'u n cabinet
> d'avocat spécialisé.

Les clauses sont là, mais rarement appliquées.



C'est une erreur classique et désuette; par exemple, les tribunaux du fisc ont
établi que si tu fais allusion à une clause de délai de paie ment dépassé sous
astreinte d'intérêts de retards ET qu'il y a retard ET que tu ne fais pas
jouer la clause, tu es redressable sur le CA non-généré (mer veille de ce pays
de cons, dirigé par des incapables tout-puissants pour qui les entrepr ises
sont l'ennemi à abattre).

...
> Et si le nom de la table n'était qu'un parm d'appel de la PS?
> Voila une idée qu'elle est bonne! (et qu'elle permet de réuti liser la PS
> avec d'autres tables).

Et de redescendre l'injection SQL un poil plus bas…



Non, comme dit plus haut, il est facile d'éviter toute injection dans une SP
postgresql.

...
> Pour la partie C, elle est aussi incluse dans la PS.

Gné ?
Ça devient limite de l'hérésie là…
Le jour où je rajoute des écrans, je dois toucher à ma BdD ? Oo



Si les écrans demandent des données non primitivement renvoyà ©es, oui - mais
c'est la même chose où que se trouve le code: il faut bien modifi er qq chose
pour changer le résultat.

> Chaque outil a ses propres spécificités; par exemple tu peux faire tout ce
> que tu veux en N-tiers en matière de communications, mais je te me ttrais
> toujours une pallée en utilisant Erlang et en scalant mon systà ¨me en 3
> lignes de code sur un nombre illimité de nodes en qq secondes.

Certes, mais qui pourra maintenir ton code derrière ?
Non pas que je défende qu'on doit pouvoir refiler la reprise de code au
premier venu, mais à l'inverse, s'il faut que la recrue mette la m ême
année que toi à comprendre le langage / système…



Tu mets le doigt sur l'un des PBs majeurs actuels: on demande aux gus sorta nt
d'une école d'être immédiatement opérationnels, ce qui est une ineptie totale.
D'abord parce qu'il y a une culture d'entreprise à acquérir, et q ue ça ne se
fait pas en un jour (eg: certains chefs demande un reporting hebdomadaire,
d'autres journalier, et ceux qui ont compris font confiance à priori); et
ensuite parce que même avec des tas de stages ils ne sont pas obligato irement
tombés sur les même cas.

ET, très contradictoirement, les entreprises ne veulent pas assumer ce tte
accoutumance à leurs us et coutumes.

Sans compter qu'une entreprise est comme un individu: elle ne peut pas tout
faire, surtout au jour d'aujourd'hui où l'on demande à chacun d' être un
spécialiste.

Alors la façon simple(iste) de se défausser, c'est de tout faire, un peu
n'importe comment, tout en générant un turnover important dans le personnel
qui n'en peut rapidement plus, ce qui va au détriment des propres int érêts de
l'entreprise.

Là-dessus je pense qu'un coup d'œil sur les manières de fair e de nos voisins
Teutons en particulier (et Alémaniques en Gal) permettrait d'y voir bc p plus
clair.

> La bonne question c'est: est-ce qu'utiliser ceci ou cela apporte vraime nt
> de l'eau au moulin ou est-ce juste un pis aller pour aller plus vite (en
> Gal au détriment de l'évolution).

Oui, à long terme.
On sait d'avance que les évolutions seront nombreuses (surtout dans mon
domaine principal, l'industrie), et les équipes très fluctuante s (SSII).
Le soft se doit d'être abordable tout en étant suffisamment bie n gaulé.



Alors il faut pousser le raisonnement à son paroxysme et utiliser tous les
outils dispos, de l'orm à la base olap, en passant par (sèpulnom) les bases
qui s'auto-reconfigurent par (re)design des flux métiers.
Mais le risque du manque de connaissance est là aussi bien présen t parce que
ces outils sont tellement généraux qu'ils demandent des compà ©tences très
particulières (et souvent directement liées au métier-client ) lors de leurs
configurations.

> Un tout ch'tit exemple: tu dis "Je change de moteur de base sans rien
> faire" sauf que chaque DB a certaines spécifités et que certa ines, même
> hors normes SQL, facilitent grandement la vie.

C'est pour ça que Hibernate définit la notion de dialecte et se base sur
les API propres à chaque moteur (non pas comme certains le pense en se
conformant à la stricte norme SQL).
Il utilisera par exemple les serial et séquences de PostgreSQL au li eu
de l'auto-incrément MySQL.



Je ne fais pas de java, donc je n'ai pas d'opinion sur Hibernate que je ne
connais que de nom; mais je me rappelle qd même avoir lû pas mal de flammes
dessus, notamment chez Pg.

> Un autre: ça ne me viendrait même pas à l'esprit ne sera it-ce qu'envisager
> d'éventuellement un jour peut-être de penser à mysql pou r une appli
> sérieuse.

C'est bien pour ça que je l'ai fait bannir de notre bureau d'ét udes.
Comme remplaçant, PostgreSQL !



Voila une chose qu'elle est bien!

Comme d'hab, il n'existe pas une solution mais une multitude de solutions
possibles pour un même PB - et je veux bien concevoir que dans le cas que tu
décris, ORM et autres aides forment une béquille qui a ses avanta ges et ses
inconvénients en fonction de l'angle d'observation.
Le seul bémol que j'y mettrais (mais ça n'est pas simple à f aire, surtout
quand on a la tête dans le guidon) serait d'évaluer en profondeur chaque outil
afin de restreindre le choix aux "bons", ou tout du moins aux plus adaptà ©s.

--
The chicken that clucks the loudest is the one most likely to show up
at the steam fitters' picnic.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le samedi 17 septembre 2011 22:41:42, vous avez écrit :
Bien que je ne maîtrise pas ce que permet de telles SP au niveau
sécurité DB, j'imagine assez mal ne pas pouvoir faire ce type de
contrôle au niveau applicatif. Peut-être me trompé-je…



Avec l'apparition de Pg ≥ 9.0 le contrôle est devenu bcp plus fin
(colonnes), il me parait donc logique que la DB s'occupe du contrôle
d'accès.



Oui et non.
Cf un peu plus loin.

C'est en partie vrai, mais depuis qq temps on observe une
convergence, à mon avis non-fortuite, entre Pg & Oracle; et il n'y a
pas tant que cela d'autres compétiteurs du même niveau. C'est pour
cela que j'essaye de penser hors des sentiers battus; la portabilité
c'est Tbien dans l'abstrait, mais encore faut-il: * qu'il y ait un
intérêt quelconque à éventuellement switcher,



J'en vois même un tous les jours, et un énorme :
– Mes tests U tournent sur une db H2, ce qui permet de lancer les tests
sans trop se soucier de l'environnement et donc de rester « unitaire »
et non « intégration »
— Ma prod tourne sur une db PostgreSQL
Le tout en ne changeant qu'un seul fichier de conf (et plus exactement 2
lignes de XML, le driver et l'URL de connexion), et rien au niveau du code.

* qu'il existe un moteur capable de rendre les même services.



Oui et non.
Ça ne sera pas forcément exactement les mêmes services, mais le même
résultat, Hibernate se chargeant de convertir mon besoin en appel natif
à la base, fonction du moteur qu'il y a derrière.

* que ladite portabilité ne se fasse pas au détriment des perfs.



Pas remarqué en tout cas.
Même mieux, Hibernate soulage énormément la bd, en cachant les requêtes.
1 SELECT + N UPDATE + 1 DELETE génèrera uniquement 2 requètes en base,
le SELECT et le DELETE, les UPDATE étant inutiles…
Idem avec les phénomènes de cache, N SELECT conduiront à 1 seul SELECT
réel, les autres tapant directement dans le cache.
J'ai même déjà vu des systèmes avec une RAM suffisamment dimensionnée
parvenir à plus ou moins 0 requête SQL (une de temps en temps en cas de
défaut de cache).

Même si N00 ça ne pose pas de PB insoluble (surtout que dans Pg,
une


fois
passé le premier appel qui déclenche la compilation, c'est le
pseudo-code qui est exécuté).



Certes, mais 300 cas centralisés dans 1 seule SP (sachant que le maximum
toléré en développement normal est 10), c'est de l'hérésie et ça pue à
plein nez le truc inmaintenable…

Pas convaincu… J'ai l'exemple d'une de mes applis de gestion
biométriques où les données nominatives n'étaient accessibles que
par les admins du système. Une partie du contrôle des accès aux
colonnes de la db était donc à faire au niveau applicatif !



Développe un peu plus parce que là je ne vois pas le tableau.



L'application en question gére la délivrance de passports biométriques.
Les champs nominatifs de la base (nom, prénom, adresse, n° sécu…) sont
accessibles uniquement aux administrateurs et aux experts biométries,
pour des raisons légales (style la CNIL chez nous).
Les personnes lambda n'ont accès qu'aux données banalisées (n°
d'enregistrement, bureau d'enregistrement…).

Ca n'est point ce que j'avions lû qq posts plus haut, gent
damoiseau!: "Certes, le « SELECT * » n'est pas recommandé. Mais il a
l'avantage de permettre d'être justement indépendant des SDD derrière
: si je modifie ma table source, je n'ai pas à modifier ma requète !"
SIC



Oui, et je maintiens mes propos.

Je peux faire un « SELECT * » mais accéder aux données par un «
row['col1'] » au lieu de « row[0] ».
En PHP, c'est la différence entre « fetch_row » et « fetch_assoc ».
Au final, je conserve un code évolutif (l'ajout de colonne ne perturbent
pas mon code), sans avoir de problème d'ordre.

Avec Hibernate, c'est encore plus simple, parce qu'il génère tout seul
la liste des colonnes qui l'intéresse !
En gérant celle en lazy-loading, etc…

Si j'ai besoin de pools et/ou de cache(s), je vais les chercher
individuellement là où ils sont 100% fonctionnels et très
performants, pas dans une soupe où l'on trouve tout et n'importe
quoi - souvent bricolés à la va-vite sur demande pressante des
utilisateurs.



Hibernate est basé sur des caches et des pools éprouvés.
Et qui n'ont pas été développés exclusivement pour lui.

Citons par exemple :
— Caches : EHCache, JBoss Cache, Oracle Coherence…
— Pools : C3P0

Apparemment mauvaise analyse dûe à une connaissance pas assez
approfondie de la DB utilisée.



Non, juste que la base avait des tables à plus de 400 colonnes, et des
critères de filtres sur 100 ou 150 critères.

Dans ce cas, fais les passer en AGILE ou XP - je ne sais plus lequel
procède par releases rapides, mais c'est un système qui a bcp
d'avantages: release when ready AND tested, puis ajouts de
fonctionnalités par releases, jusqu'à release 1.0



Le soucis n'était pas d'ajouter de nouvelles fonctionnalités, mais de
savoir dans le détail comment les SP étaient gaulées, afin de limiter
les duplications, de cerner les régressions possibles…
Quand tu as des centaines de SP devant toi et que tu dois implémenter «
chercher les X qui contiennent Y et les trier par Z », t'as 2 solutions :
— soit tu passes du temps à dépiauter tes SP dans tous les sens pour
voir si une ne ferait pas déjà les ¾ du boulot (du genre «
SPChercherXContenantY ») et éviter ainsi la duplication des SP
— soit tu ne cherches pas à comprendre et tu fais directement ta SP «
SPChercherXContenantYTrieParZ », quitte à dupliquer et exploser encore
plus la quantité de SP
Idem lorsqu'on devait ajouter une colonne, lesquelles des centaines de
SP est à vérifier et/ou corriger ?

Ha haaaa, la vieille base qu'on ne peut pas toucher - un must du


classique!
C'est aussi là que la préparation pêche: soit le client conserve sa


base et
il encaisse *également* les inconvénients qui vont avec, soit il y a
migration et donc création d'une Nlle base.



On lui avait bien fait remarqué que la base n'utilisait peu ou pas les
clefs étrangères, étaient mal indexées ou conçues.
On avait même réussi à poser une clause de non-engagement sur les perfs.

Le soucis est qu'on s'est laissé mangé par l'apparente facilité des
règles métier. Au final, elles n'étaient pas très compliquées (si la
transaction va de X à Y avec une carte de la banque Z, donner tant à A1,
tant à A2, tant à A3…).
On a juste bien déchanté quand on s'est rendu compte de la complexité
des requêtes derrière, d'autant plus qu'on avait la contrainte de tout
faire en SP.
Et on a encore plus déchanté quand le client, après avoir fourni un
fichier de 2ko de règles de gestion dans l'appel d'offre, nous a fourni
le service externe réel, qui nous balançait des fichiers de 200Mo et
quelques 80.000 règles de répartition !

Là encore, c'est une question d'analyse préalable - prendre un
marché, c'est bien, mais pas s'il doit se transformer en sables
mouvants dès le dev.



On n'a souvent pas assez de temps pour éponger tous les problèmes
techniques potentiels, surtout ceux à plus ou moins long terme.
Même avec des mois d'analyse, une doc de 1.000 pages reste forcément
avec des pièges…
D'autant plus que si dès qu'on avait un risque potentiel on refusait un
appel d'offre, ça fait belle lurette qu'on aurait plus de projet…

Là encore c'est un défaut d'analyse: comment accepter des données
externes alors qu'elles auraient dû se trouver dans la DB?



Les données provenaient de systèmes externes et/ou de sous-systèmes,
sous la forme de web-services.

Pour te donner une idée, même les tailles & positionnements des


fenêtres de
mon projet sont stockés dans la DB.



Pas réalisable ici.
Les données de conf sont « dynamiques » et rentrent très mal dans une
base relationnelle.
Par exemple, des règles peuvent générer entre 1 et N répartitions,
fonction de données variables de la transaction bancaire de départ (lieu
d'émission, détenteur carte, type de carte, débiteur, créditeur,
fournisseur de la carte…).

Une fois que c'est fait, on définit une ligne de process par
taxe/ristourne/etc puis les SP qui vont bien, puis la SP qui
chapeaute le tout (SI il y en a vraiment besoin, par qu'il est
facile d'automatiser ce type de traitement en chaînant les SP d'une
façon transparente).

Le nombre de paramètres à passer aux SPs étaient effroyables
(jusqu'à 300 paramètres pour la plus grosse de mémoire).



Ca me parait, là encore, relever d'une erreur de conception liée au §
ci-dessus.



Non.
En gros, une transaction comporte 300 caractéristiques, comme
l'émetteur, l'origine, la destination, le type de carte, le montant…
Et en entrée on avait une conf avec quasiment autant de paramètres, qui
disait plus ou moins « si une transaction a cette gueule, elle se
décompose en X sous-transactions », chaque sous-transaction étant
elle-même représentée par des centaines de champs et pouvant être soit
un montant fixe soit un pourcentage du montant de départ.
Et le système n'était qu'un gros calculateur du type « sous-transactions
= f(transaction, conf) ».
Le gros soucis est que « f() » n'est pas linéaire… « f([a, b], c) ! [f(a, c), f(b, c)] ». On ne peut pas faire de traitement par lots, mais
uniquement transaction par transaction.

Gné ? Ça devient limite de l'hérésie là… Le jour où je rajoute des
écrans, je dois toucher à ma BdD ? Oo



Si les écrans demandent des données non primitivement renvoyées, oui
- mais c'est la même chose où que se trouve le code: il faut bien
modifier qq chose pour changer le résultat.



Oui, mais pas les requêtes (ie. les SP chez toi).
Ajouter un écran n'est qu'une histoire de présentation, pas de processing.
Si je veux présenter mes données en XML d'un côté et en HTML de l'autre,
mes requêtes sont strictement identiques !

Alors il faut pousser le raisonnement à son paroxysme et utiliser
tous les outils dispos, de l'orm à la base olap, en passant par
(sèpulnom) les bases qui s'auto-reconfigurent par (re)design des
flux métiers. Mais le risque du manque de connaissance est là aussi
bien présent parce que ces outils sont tellement généraux qu'ils
demandent des compétences très particulières (et souvent directement
liées au métier-client) lors de leurs configurations.



Tout est une histoire de mesure.
Tombé dans l'OLAP, c'est quand même le canon de 14 pour tuer un
moustique. La mitrailleuse lourde est déjà bien suffisante et possède
assez de marge pour descendre une marmotte si le besoin s'en fait sentir.

Je ne fais pas de java, donc je n'ai pas d'opinion sur Hibernate que
je ne connais que de nom; mais je me rappelle qd même avoir lû pas
mal de flammes dessus, notamment chez Pg.



Tout le monde a ses flammes contre quelqu'un =)

Le seul bémol que j'y mettrais (mais ça n'est pas simple à faire,
surtout quand on a la tête dans le guidon) serait d'évaluer en
profondeur chaque outil afin de restreindre le choix aux "bons", ou
tout du moins aux plus adaptés.



Oui, je n'ai jamais dis que je sortais un ORM et du 3-tiers dès qu'on
gueule « nouveau projet !!!! » =)

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOdRVBAAoJEK8zQvxDY4P9+fQIAIycw8Z20WLXvc3JSLY1IIrB
dE4wgkcB+S6IEAt/5fQuhfFkZqYd2X6lgiud8XwiBEO6TtCEWGcgbx6aIW9f0Uiq
o+2LDhpSOPIhTDv67/7GQlIGOhQTk3gQViKOliw93abdlF6xs7+TFTcLK81z98eX
EjcBUEixiUJX3smzSC598BLIyet9ES+7C/EE9zZSMdqIOCZQUqibSUPPG35brwhH
Av/z7TCFcaexFCoZeoNUj7pJ2evUmxHQ1k1uklgvKFMg1vjfAWe9QMXcoOP8p9NH
4Bg8Bgws9ZyXJpeB6HirDDDQeZNhMOL5CShYXI8jX4p7ZZw14Fe5ROXWHsa9tNE =0l2Z
-----END PGP SIGNATURE-----

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/4e751549$0$1385$
Avatar
Jean-Yves F. Barbier
On Sat, 17 Sep 2011 23:46:49 +0200, Aéris wrote:

...
> Même si N00 ça ne pose pas de PB insoluble (surtout que d ans Pg,
> une
fois
> passé le premier appel qui déclenche la compilation, c'est le
> pseudo-code qui est exécuté).

Certes, mais 300 cas centralisés dans 1 seule SP (sachant que le max imum
toléré en développement normal est 10), c'est de l'hé résie et ça pue à
plein nez le truc inmaintenable…



Je suis bien d'accord.

...
L'application en question gére la délivrance de passports biom étriques.
Les champs nominatifs de la base (nom, prénom, adresse, n° sà ©cu…) sont
accessibles uniquement aux administrateurs et aux experts biométries,
pour des raisons légales (style la CNIL chez nous).
Les personnes lambda n'ont accès qu'aux données banalisées (n°
d'enregistrement, bureau d'enregistrement…).



Je vois, il va falloir commencer à plancher dur sur des ptit qq choses
polymorphiques à encryptions multiples targetant aussi bien ces DBs qu e leurs
backups...

...
Je peux faire un « SELECT * » mais accéder aux donnée s par un «
row['col1'] » au lieu de « row[0] ».
En PHP, c'est la différence entre « fetch_row » et « fetch_assoc ».
Au final, je conserve un code évolutif (l'ajout de colonne ne pertur bent
pas mon code), sans avoir de problème d'ordre.

Avec Hibernate, c'est encore plus simple, parce qu'il génère to ut seul
la liste des colonnes qui l'intéresse !
En gérant celle en lazy-loading, etc…



Ok, je vois mieux le tableau.

...
> Apparemment mauvaise analyse dûe à une connaissance pas assez
> approfondie de la DB utilisée.

Non, juste que la base avait des tables à plus de 400 colonnes, et d es
critères de filtres sur 100 ou 150 critères.



Je rajoute "de base" à mauvaise analyse: quand on se retrouve avec des tables
et des filtres aussi gros c'est que la conception de base s'est fourré e le
doigt dans l'œil jusqu'au trognon. (je parle de l'antérieur).

> Dans ce cas, fais les passer en AGILE ou XP - je ne sais plus lequel
> procède par releases rapides, mais c'est un système qui a bc p
> d'avantages: release when ready AND tested, puis ajouts de
> fonctionnalités par releases, jusqu'à release 1.0

Le soucis n'était pas d'ajouter de nouvelles fonctionnalités, m ais de
savoir dans le détail comment les SP étaient gaulées, afin de limiter
les duplications, de cerner les régressions possibles…
Quand tu as des centaines de SP devant toi et que tu dois implémente r «
chercher les X qui contiennent Y et les trier par Z », t'as 2 soluti ons :
— soit tu passes du temps à dépiauter tes SP dans tous les sens pour
voir si une ne ferait pas déjà les ¾ du boulot (du genre «
SPChercherXContenantY ») et éviter ainsi la duplication des SP
— soit tu ne cherches pas à comprendre et tu fais directemen t ta SP «
SPChercherXContenantYTrieParZ », quitte à dupliquer et exploser encore
plus la quantité de SP
Idem lorsqu'on devait ajouter une colonne, lesquelles des centaines de
SP est à vérifier et/ou corriger ?



Effectivement, ça n'est gérable que par du middleware.

> Ha haaaa, la vieille base qu'on ne peut pas toucher - un must du
classique!
> C'est aussi là que la préparation pêche: soit le client conserve sa
base et
> il encaisse *également* les inconvénients qui vont avec, soit il y a
> migration et donc création d'une Nlle base.

On lui avait bien fait remarqué que la base n'utilisait peu ou pas l es
clefs étrangères, étaient mal indexées ou conçue s.
On avait même réussi à poser une clause de non-engagement sur les perfs.



Là n'était pas le PB, il se trouve dans la phrase au-dessus: comm ent
avez-vous pu accepter de reprendre cette DB telle quelle?!; je ne parle
même plus des tables à 400 colonnes, mais bien des mauvaises inde xations; c'est
typiquement symptomatique d'un mille-feuille jamais retouché (à m oins que les
concepteurs de base n'aient *vraiment* été des burnes, ce qui exi ste
malheureusement).

Le soucis est qu'on s'est laissé mangé par l'apparente facilit é des
règles métier. Au final, elles n'étaient pas très com pliquées (si la
transaction va de X à Y avec une carte de la banque Z, donner tant à A1,
tant à A2, tant à A3…).
On a juste bien déchanté quand on s'est rendu compte de la comp lexité
des requêtes derrière, d'autant plus qu'on avait la contrainte de tout
faire en SP.
Et on a encore plus déchanté quand le client, après avoir fourni un
fichier de 2ko de règles de gestion dans l'appel d'offre, nous a fou rni
le service externe réel, qui nous balançait des fichiers de 200 Mo et
quelques 80.000 règles de répartition !



Wai, ça revient à l'histoire de mon pote: on vous a refilé l e truc dont
personne ne voulait en cachant bien la merde au chat.

D'ailleurs, je me demande si ça ne serait pas une idée de site pr o à monter
ça: un répertoire des boîtes qui se foutent du monde rapport à leurs demandes
impossibles...

...
On n'a souvent pas assez de temps pour éponger tous les problèm es
techniques potentiels, surtout ceux à plus ou moins long terme.
Même avec des mois d'analyse, une doc de 1.000 pages reste forcà ©ment
avec des pièges…
D'autant plus que si dès qu'on avait un risque potentiel on refusait un
appel d'offre, ça fait belle lurette qu'on aurait plus de projet⠀¦



J'entends bien, mais là encore les défauts de base de la DB à ©taient
rédhibitoires.

> Là encore c'est un défaut d'analyse: comment accepter des don nées
> externes alors qu'elles auraient dû se trouver dans la DB?

Les données provenaient de systèmes externes et/ou de sous-syst èmes,
sous la forme de web-services.



C'est plus une usine à gaz mais un complexe pétrolier au grand co mplet ton
histoire :(

...
Non.
En gros, une transaction comporte 300 caractéristiques, comme
l'émetteur, l'origine, la destination, le type de carte, le montant …
Et en entrée on avait une conf avec quasiment autant de paramèt res, qui
disait plus ou moins « si une transaction a cette gueule, elle se
décompose en X sous-transactions », chaque sous-transaction à ©tant
elle-même représentée par des centaines de champs et pouva nt être soit
un montant fixe soit un pourcentage du montant de départ.
Et le système n'était qu'un gros calculateur du type « sou s-transactions
= f(transaction, conf) ».
Le gros soucis est que « f() » n'est pas linéaire… « f([a, b], c) !=
[f(a, c), f(b, c)] ». On ne peut pas faire de traitement par lots, m ais
uniquement transaction par transaction.



Je vois.

...
> Alors il faut pousser le raisonnement à son paroxysme et utiliser
> tous les outils dispos, de l'orm à la base olap, en passant par
> (sèpulnom) les bases qui s'auto-reconfigurent par (re)design des
> flux métiers. Mais le risque du manque de connaissance est là aussi
> bien présent parce que ces outils sont tellement générau x qu'ils
> demandent des compétences très particulières (et souvent directement
> liées au métier-client) lors de leurs configurations.

Tout est une histoire de mesure.
Tombé dans l'OLAP, c'est quand même le canon de 14 pour tuer un
moustique. La mitrailleuse lourde est déjà bien suffisante et p ossède
assez de marge pour descendre une marmotte si le besoin s'en fait sentir.



Ben pas vraiment, vu comment tu décris la chose (d'un autre monde:)
OLAP, middleware(s) et le reste qui va bien avec - mais même comme à §a, ça
reste du monstrueux construit sur une base inacceptable (la DB).
Ca permet aussi n'importe quelle gymnastique dans le cadre du reporting sans
trop d'efforts à fournir.

Les trucs que je ne comprends pas c'est pourquoi vous avez pris l'affaire
sachant que la base était pourrie (principe de la chaîne), ni cas sé le
contrat lorsque le client vous a avoué que c'était en fait 80k r ègles qu'il
fallait appliquer?
Et pourquoi à la base les concepteurs DB n'ont pas mis un véto ab solu, au vu de
l'état de la base à reprendre?

Mais remarquons le bon côté de la chose: en se faisant bien mettr e une fois
comme celle-là on reste normalement vacciné un long moment aprà ¨s ;-)

--
The attacker must vanquish; the defender need only survive.

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/
Avatar
Aéris
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Le 18/09/2011 01:10, Jean-Yves F. Barbier a écrit :
Je rajoute "de base" à mauvaise analyse: quand on se retrouve avec des tables
et des filtres aussi gros c'est que la conception de base s'est fourrée le
doigt dans l'œil jusqu'au trognon. (je parle de l'antérieur).



J'ai le droit à un joker pour les concepteurs de la base antérieure ? =)
Mais sinon, même sans ça, j'ai du mal à voir comment on aurait pu faire
mieux, une transaction bancaire étant RÉELLEMENT aussi complexe à
décrire, le modèle de données l'est tout autant.
Ou alors il aurait fallu des champs banalisés ou structurés, mais on
aurait perdu en capacité de requétage.

Effectivement, ça n'est gérable que par du middleware.



Ben pourtant, j'ai l'impression que l'approche par SP parvient très vite
à ce niveau de complexité.
Après, il y a peut-être des manières de faire que je ne vois pas pour le
moment qui permettent de limiter les dégâts, mais de ce que je connais
des SP et de leur fonctionnement, j'en doute très fortement.

Là n'était pas le PB, il se trouve dans la phrase au-dessus: comment
avez-vous pu accepter de reprendre cette DB telle quelle?!;



Faut bien travailler parfois =)

je ne parle
même plus des tables à 400 colonnes, mais bien des mauvaises indexations; c'est
typiquement symptomatique d'un mille-feuille jamais retouché (à moins que les
concepteurs de base n'aient *vraiment* été des burnes, ce qui existe
malheureusement).



Les choix technologiques antérieurs n'étaient pas pertinents (Microsoft
SQL Server, SSIS…).
L'absence d'indexes s'expliquait par exemple par le fait que les tables
étaient partitionnées par date pour des contraintes de purge rapide des
données (daily rolling window). Sauf que du coup, la pose d'indexes ne
contenant pas la clef de partitionnement était interdite afin de pouvoir
aussi partitionner les indexes, sinon le rolling conduisait à une
reconstruction intégrale des indexes, qui plombait les purges (3j au
lieu de 10s).

Wai, ça revient à l'histoire de mon pote: on vous a refilé le truc dont
personne ne voulait en cachant bien la merde au chat.



Tout le monde a connu un projet comme ça malheureusement…

D'ailleurs, je me demande si ça ne serait pas une idée de site pro à monter
ça: un répertoire des boîtes qui se foutent du monde rapport à leurs demandes
impossibles...



Ah ben c'est simple : tout le monde…
En tout cas en SSII, les appels d'offre qu'on reçoit, c'est le cas,
sinon la boîte en face l'aurait gardé en interne !

La plupart du temps, le client est elle-même prestataire et se rend
compte qu'il ne pourra pas tenir les délais de l'appel d'offre initial,
mais il doit bosser. El prend le contrat, et sous-traite au forfait une
partie plus ou moins cruciale, en tentant de cacher la misère.
Celui qui signe la sous-traitance s'engage avec obligation de résultat,
ne tiendra pas ses délais, mais la boîte d'origine pourra rejetter la
faute du retard (anticipé…) sur son presta, voire lui faire payer des
pénalités qui compenseront celles (prévues…) que la boîte doit payer à
son client final.

J'entends bien, mais là encore les défauts de base de la DB étaient
rédhibitoires.



Pas tant que ça.
Une fois qu'on a (enfin) pu faire comprendre au client que les SPs,
c'était pas le bon plan, on a foutu un middleware et un ORM, et roule.
En 3 semaines, le taff était fait, contre 12 mois pour la version SP (et
sans parvenir au bout…).

Les données provenaient de systèmes externes et/ou de sous-systèmes,
sous la forme de web-services.



C'est plus une usine à gaz mais un complexe pétrolier au grand complet ton
histoire :(



C'est souvent le cas en système d'info, tu ne dépends que très rarement
que de ton seul sous-système.
La plupart du temps, tu t'interfaces avec des systèmes tiers, via
web-service, échange de fichiers, FTP, SSH, messaging…
La base de données est souvent totalement contre-indiqué pour ce genre
d'usage (N clients différents, polling de masse, données peu ou pas
structurées, contrôle d'intégrité et de cohérence, chiffrement, signature…)

Tout est une histoire de mesure.
Tombé dans l'OLAP, c'est quand même le canon de 14 pour tuer un
moustique. La mitrailleuse lourde est déjà bien suffisante et possède
assez de marge pour descendre une marmotte si le besoin s'en fait sentir.



Ben pas vraiment, vu comment tu décris la chose (d'un autre monde:)
OLAP, middleware(s) et le reste qui va bien avec - mais même comme ça, ça
reste du monstrueux construit sur une base inacceptable (la DB).
Ca permet aussi n'importe quelle gymnastique dans le cadre du reporting sans
trop d'efforts à fournir.



Le problème était clairement la BdD faite avec 2 pieds gauches.
Si on avait pas eu le soucis d'historique du bordel, c'est clair que
c'était OLAP, ETL, Birt, OW2…

Les trucs que je ne comprends pas c'est pourquoi vous avez pris l'affaire
sachant que la base était pourrie (principe de la chaîne), ni cassé le
contrat lorsque le client vous a avoué que c'était en fait 80k règles qu'il
fallait appliquer?



Toujours les mêmes problèmes :
Faut bien bosser un jour et le client cache très bien la misère.
Les 80k de règles étaient décrites dans le CdC comme ceci : « le système
doit s'interfacer un sous-système externe. En annexe, le XSD des
fichiers d'entrée ainsi qu'un fichier *d'exemple* ». L'exemple donné
était quand même assez conséquent (2 ou 3ko), XSD/XML on sait facilement
faire, on a pas forcément pensé qu'on allait se prendre ×20 au réel,
d'autant plus qu'on était plus paniqué par l'état de la BdD et de
l'obligation de SP.
Mais certes, on aurait du réagir sur le mot « exemple », et demander des
précisions sur la volumétrie.

Et pourquoi à la base les concepteurs DB n'ont pas mis un véto absolu, au vu de
l'état de la base à reprendre?



On a mis notre véto, et le contrat signé stipulait bien qu'on ne
s'engageait sur aucune perf étant donné qu'on était contraint sur le
modèle de données.

Mais remarquons le bon côté de la chose: en se faisant bien mettre une fois
comme celle-là on reste normalement vacciné un long moment après ;-)



Ça c'est la théorie ^_^
Dans la pratique, je sais par expérience que malgré une erreur déjà
commise, ça n'empèche pas les SSII de re-signer la même connerie plus
tard, parfois avec un peu plus de garde-fous mais resigner quand même.
L'exemple le plus récurrent étant le fait de signer un appel d'offre en
considérant le CdC client comme spécification, au motif que le CdC
paraît bien détaillé (plus de 300 pages, 1.000 besoins numérotés pris
comme « exigences », diagramme de séquence, copies d'écrans ou
mock-up…). Et qu'on se fait déboîter derrière quand on se rend compte
qu'il va falloir 2 mois de specs pour 5 jours vendus (incohérences
métiers et/ou techniques, trous dans les besoins, manques de précisions,
méprises sur des termes communs qui sont en réalité métiers)…

Le pire cas que j'ai vu passer, c'est une incompréhension sur un terme
du langage courant, qui changeait tout le fonctionnement du système si
on prenait sa signification réelle métier.
En gros, c'était comme si je te disais « tu n'as pas éteint la lumière
». En langage courant, tu en comprends qu'elle est allumée et que tu
dois aller l'éteindre. En langage métier, ça signifiait qu'elle était
peut-être allumée et qu'il fallait l'éteindre, mais aussi que si elle
était éteinte, il fallait l'allumer puis l'éteindre aussitôt !
Faute de specs dignes de ce nom, déboîtage du projet…

- --
Aeris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.11 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iQEcBAEBAgAGBQJOdcjDAAoJEK8zQvxDY4P9Z6kH/3YFFUrlZMqsltKCoW9EwN5h
vM+CGeEtAD1wFDuzPMODJdej6TiMTRHEesZY2PSXBn+vdlPqwXfb0y/HqOd7PfCC
pQcpqR+DNqh/xCsBkVO7Oa8aDUhxfap1rTwrFcTKvBUulKNaaKwY3Vt8T/1sYQkt
kEEZBP847AURx6++7InvO0D6u4JkdkrIX7bnc9aAG6U7LBVtMTpP/49+hzRMXStm
sl/IvkNXQ/lIouIZou+2KnR0eVf9eGAER44Sd+FyfidneotzB54G9PFuoNwdMZ3h
ie9g/UiXgJeW33DEpQaNQgdLdI1z4VJWAjBehR56OnwuL7I72P8iCHAQs7qihOg =L5Rl
-----END PGP SIGNATURE-----

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/fr/FrenchLists

Pour vous DESABONNER, envoyez un message avec comme objet "unsubscribe"
vers
En cas de soucis, contactez EN ANGLAIS
Archive: http://lists.debian.org/4e75c8cf$0$28053$
1 2 3 4