account
This commit is contained in:
@@ -63,6 +63,7 @@ insert into company(id, name, registration_number, created_at)
|
||||
### Vérification
|
||||
|
||||
```sql
|
||||
create view list_holders as
|
||||
select h.id, h.type, h.created_at,
|
||||
p.firstname || ' ' || p.lastname as person,
|
||||
c.name as company
|
||||
@@ -112,3 +113,32 @@ create trigger trg_check_person_age
|
||||
before insert or update on person
|
||||
for each row execute procedure check_person_age();
|
||||
```
|
||||
|
||||
### 2. Les comptes
|
||||
|
||||
```sql
|
||||
create table account (
|
||||
id bigint primary key generated always as identity,
|
||||
number text unique not null,
|
||||
opened_at date not null default current_date,
|
||||
closed_at date,
|
||||
balance numeric(18,6) not null default 0 check (balance >= 0)
|
||||
);
|
||||
```
|
||||
|
||||
Chaque compte a un numéro unique.
|
||||
La contrainte check (balance >= 0) empêche les soldes négatifs.
|
||||
|
||||
```sql
|
||||
create table account_holder (
|
||||
account_id int not null references account(id) on delete cascade,
|
||||
holder_id int not null references holder(id) on delete cascade,
|
||||
share numeric(4,3) check (share > 0 and share <= 1),
|
||||
primary key (account_id, holder_id)
|
||||
);
|
||||
```
|
||||
|
||||
Cette table établit la relation n–n entre account et holder.
|
||||
La contrainte share assure que les parts sont comprises entre 0 et 1.
|
||||
|
||||
Un compte joint correspond donc à plusieurs lignes dans cette table.
|
||||
|
||||
19
banque.md
19
banque.md
@@ -50,9 +50,9 @@ Supprimer un titulaire, vérifier que cela supprime l'individu ou la société c
|
||||
|
||||
### 1.5 Réflexion
|
||||
|
||||
- 1. Pourquoi séparer `person` et `company` ?
|
||||
- 2. Pourquoi ne pas tout mettre dans une seule table holder ?
|
||||
- 3. Quelle contrainte empêche d’insérer une person sans holder ?
|
||||
1. Pourquoi séparer `person` et `company` ?
|
||||
2. Pourquoi ne pas tout mettre dans une seule table holder ?
|
||||
3. Quelle contrainte empêche d’insérer une person sans holder ?
|
||||
|
||||
### 1.6 Pour aller plus loin
|
||||
|
||||
@@ -60,5 +60,14 @@ La banque souhaite désormais que toute personne titulaire d’un compte ait au
|
||||
|
||||
## 2. Les comptes
|
||||
|
||||
- Un compte bancaire appartient à un ou plusieurs titulaires (_holders_).
|
||||
- Chaque compte dispose d’un numéro de compte (_account number_) unique et d’un solde.
|
||||
- Chaque titulaire peut détenir un ou plusieurs compte.
|
||||
- Un compte bancaire doit pouvoir appartenir à un ou plusieurs titulaires (compte individuel / compte joint).
|
||||
- Chaque compte dispose d’un numéro de compte (_account number_) unique, d’un solde, d'une date d'ouverture et une date de clôture.
|
||||
- Le solde des comptes ne peuvent être négatifs.
|
||||
- Dans le cas d'un compte joint, les parts de propriété d'un compte doivent pouvoir être précisées.
|
||||
|
||||
### 2.1 Exemple de données
|
||||
|
||||
- Créez un compte individuel pour Françoise Zanetti.
|
||||
- Ajouter un nouveau titulaire : Justin Hébrard né le 11/03/1993.
|
||||
- Créez un compte joint pour Françoise et Justin.
|
||||
|
||||
@@ -348,6 +348,7 @@ create schema bank;
|
||||
|
||||
-- Générateur de numéro aléatoire
|
||||
-- ----------------------------------------------------------------------
|
||||
/*
|
||||
CREATE OR REPLACE FUNCTION bank.rand_account(n integer)
|
||||
RETURNS text AS $$
|
||||
DECLARE
|
||||
@@ -369,9 +370,10 @@ BEGIN
|
||||
RETURN out;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
*/
|
||||
-- Devises (Currencies)
|
||||
-- ----------------------------------------------------------------------
|
||||
/*
|
||||
create table bank.currency (
|
||||
code text not null,
|
||||
num4217 integer default null,
|
||||
@@ -416,9 +418,11 @@ alter table only pays_devises
|
||||
alter table only pays_devises
|
||||
add foreign key (devise_code)
|
||||
references bank.currency (code);
|
||||
*/
|
||||
|
||||
-- Taux de change ()
|
||||
-- ----------------------------------------------------------------------
|
||||
/*
|
||||
CREATE TABLE bank.exchange_rate (
|
||||
from_currency CHAR(3) references bank.currency(code),
|
||||
to_currency CHAR(3) references bank.currency(code),
|
||||
@@ -467,11 +471,13 @@ BEGIN
|
||||
END $$;
|
||||
|
||||
DROP table exchange;
|
||||
*/
|
||||
|
||||
-- ----------------------------------------------------------------------
|
||||
-- Titulaires (Holders)
|
||||
-- ----------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
CREATE TABLE bank.holder (
|
||||
id bigint primary key generated always as identity,
|
||||
type_titulaire TEXT CHECK (type_titulaire IN ('individu', 'société')) NOT NULL,
|
||||
@@ -515,11 +521,13 @@ CREATE TRIGGER trg_auto_titulaire_morale
|
||||
BEFORE INSERT ON societe
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION auto_titulaire_morale();
|
||||
*/
|
||||
|
||||
-- ----------------------------------------------------------------------
|
||||
-- Comptes (Accounts)
|
||||
-- ----------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
create table bank.account (
|
||||
id bigint primary key generated always as identity,
|
||||
account_number text unique not null,
|
||||
@@ -576,10 +584,11 @@ BEGIN
|
||||
END LOOP;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
*/
|
||||
|
||||
-- Transactions
|
||||
-- ----------------------------------------------------------------------
|
||||
|
||||
/*
|
||||
CREATE TABLE bank."transaction" (
|
||||
id UUID PRIMARY KEY DEFAULT uuidv7(),
|
||||
reference TEXT,
|
||||
@@ -705,7 +714,7 @@ CREATE TRIGGER tr_notify_transaction
|
||||
AFTER INSERT ON bank.transaction
|
||||
FOR EACH ROW
|
||||
EXECUTE FUNCTION notify_transaction();
|
||||
|
||||
*/
|
||||
-- ----------------------------------------------------------------------
|
||||
-- Business Intelligence
|
||||
-- ----------------------------------------------------------------------
|
||||
|
||||
@@ -16,6 +16,7 @@ truncate table fournisseur;
|
||||
\COPY fournisseur FROM '/tmp/fournisseur.csv' (FORMAT CSV, header, ENCODING 'UTF8');
|
||||
\COPY produit FROM '/tmp/produits/cereales_petitdejeuner.csv' (FORMAT CSV, header, ENCODING 'UTF8');
|
||||
|
||||
/*
|
||||
\COPY personne(prenom, nom, telephone, ville) FROM '/tmp/personne1.csv' (FORMAT CSV, header, ENCODING 'UTF8');
|
||||
\COPY societe(societe) FROM '/tmp/societe1.csv' (FORMAT CSV, header, ENCODING 'UTF8');
|
||||
|
||||
@@ -25,3 +26,4 @@ SELECT bank.insert_account_random(ARRAY[3]);
|
||||
SELECT bank.insert_account_random(ARRAY[4]);
|
||||
SELECT bank.insert_account_random(ARRAY[5],'USD');
|
||||
SELECT bank.insert_account_random(ARRAY[6,11]);
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user