Opération bancaires et transactions

[1 heure]

On désire réalisation une BD[1] permettant de gérer les comptes bancaires des clients selon les modalités suivantes :

  • Chaque client possède un compte courant et éventuellement un compte d'épargne.

  • Un compte est identifié par un numéro unique composé d'un numéro de pays, d'un numéro de ville (relatif au pays), d'un numéro d'agence (relatif à la ville), et d'un numéro propre (fourni par l'agence). A des fins d'identification du compte par un opérateur humain, on gardera dans la BD un intitulé pour les pays, villes et agences.

  • Il est possible de faire des transferts d'un compte sur l'autre

  • Il est possible de débiter (enlever) de l'argent depuis le compte courant

  • Il est possible de créditer (ajouter) de l'argent sur les deux comptes

  • Les comptes doivent toujours être positifs

  • On ne garde pas la mémoire des opérations, seules les soldes sur les comptes sont gérés

  • Un client est décrit par son nom, son prénom, sa civilité.

Question

Réaliser la conception complète de la BD

Indice

La conception complète signifie le MCD, le MLD et et le code SQL de création de l'implémentation physique.

Question

Soient les événements suivants survenant sur la BD :

  • Le client Robert Dupont est créé dans l'agence du centre ville de Compiègne, qui vient d'ouvrir.

  • Le client Alphonse Durand est créé dans la même agence, mais il veut également un compte d'épargne sur lequel il dépose tout de suite 1000

  • Le client Robert Dupont dépose deux chèques de 100 sur son compte courant.

  • Le client Alphonse Durand transfère 500 de son compte d'épargne à son compte courant.

Écrire le code SQL permettant de traiter ces événements, sans utiliser de transactions

Suite à des problèmes de coupure réseaux, on constate des problèmes sur les comptes. Ainsi suite à l'exécution des opérations précédentes, la requête suivante renvoie des résultats erronés.

1
SELECT tCompteCourant.fkClient AS N, tCompteCourant.aSolde + COALESCE(tCompteEpargne.aSolde,0) AS SoldeDeTousComptes
2
FROM tCompteCourant LEFT JOIN TCompteEpargne 
3
ON tCompteCourant.fkClient=TCompteEpargne.fkClient;
Résultat retourné

N

SoldeDeTousComptes

1

100

2

500

Question

Réécrivez le résultat de la requête avec les valeurs qui étaient attendues.

Indice

La fonction COALESCE (x, y, z...) renvoie comme valeur le premier de ses paramètres non NULL.

Question

Expliquer à quoi peuvent être dus les problèmes rencontrés.

Question

Proposer une solution permettant d'assurer la cohérence des opérations, en aménageant cotre code SQL.