Opération bancaires et transactions

[1 heure]

On désire réalisation une BD 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

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.

CTRL+C pour copier, CTRL+V pour coller
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;
SELECT tCompteCourant.fkClient AS N, tCompteCourant.aSolde + COALESCE(tCompteEpargne.aSolde,0) AS SoldeDeTousComptes
FROM tCompteCourant LEFT JOIN TCompteEpargne 
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.

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.