account
This commit is contained in:
@@ -63,6 +63,7 @@ insert into company(id, name, registration_number, created_at)
|
|||||||
### Vérification
|
### Vérification
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
|
create view list_holders as
|
||||||
select h.id, h.type, h.created_at,
|
select h.id, h.type, h.created_at,
|
||||||
p.firstname || ' ' || p.lastname as person,
|
p.firstname || ' ' || p.lastname as person,
|
||||||
c.name as company
|
c.name as company
|
||||||
@@ -112,3 +113,32 @@ create trigger trg_check_person_age
|
|||||||
before insert or update on person
|
before insert or update on person
|
||||||
for each row execute procedure check_person_age();
|
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.5 Réflexion
|
||||||
|
|
||||||
- 1. Pourquoi séparer `person` et `company` ?
|
1. Pourquoi séparer `person` et `company` ?
|
||||||
- 2. Pourquoi ne pas tout mettre dans une seule table holder ?
|
2. Pourquoi ne pas tout mettre dans une seule table holder ?
|
||||||
- 3. Quelle contrainte empêche d’insérer une person sans holder ?
|
3. Quelle contrainte empêche d’insérer une person sans holder ?
|
||||||
|
|
||||||
### 1.6 Pour aller plus loin
|
### 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
|
## 2. Les comptes
|
||||||
|
|
||||||
- Un compte bancaire appartient à un ou plusieurs titulaires (_holders_).
|
- Chaque titulaire peut détenir un ou plusieurs compte.
|
||||||
- Chaque compte dispose d’un numéro de compte (_account number_) unique et d’un solde.
|
- 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
|
-- Générateur de numéro aléatoire
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
/*
|
||||||
CREATE OR REPLACE FUNCTION bank.rand_account(n integer)
|
CREATE OR REPLACE FUNCTION bank.rand_account(n integer)
|
||||||
RETURNS text AS $$
|
RETURNS text AS $$
|
||||||
DECLARE
|
DECLARE
|
||||||
@@ -369,9 +370,10 @@ BEGIN
|
|||||||
RETURN out;
|
RETURN out;
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
*/
|
||||||
-- Devises (Currencies)
|
-- Devises (Currencies)
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
/*
|
||||||
create table bank.currency (
|
create table bank.currency (
|
||||||
code text not null,
|
code text not null,
|
||||||
num4217 integer default null,
|
num4217 integer default null,
|
||||||
@@ -416,9 +418,11 @@ alter table only pays_devises
|
|||||||
alter table only pays_devises
|
alter table only pays_devises
|
||||||
add foreign key (devise_code)
|
add foreign key (devise_code)
|
||||||
references bank.currency (code);
|
references bank.currency (code);
|
||||||
|
*/
|
||||||
|
|
||||||
-- Taux de change ()
|
-- Taux de change ()
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
/*
|
||||||
CREATE TABLE bank.exchange_rate (
|
CREATE TABLE bank.exchange_rate (
|
||||||
from_currency CHAR(3) references bank.currency(code),
|
from_currency CHAR(3) references bank.currency(code),
|
||||||
to_currency CHAR(3) references bank.currency(code),
|
to_currency CHAR(3) references bank.currency(code),
|
||||||
@@ -467,11 +471,13 @@ BEGIN
|
|||||||
END $$;
|
END $$;
|
||||||
|
|
||||||
DROP table exchange;
|
DROP table exchange;
|
||||||
|
*/
|
||||||
|
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
-- Titulaires (Holders)
|
-- Titulaires (Holders)
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
CREATE TABLE bank.holder (
|
CREATE TABLE bank.holder (
|
||||||
id bigint primary key generated always as identity,
|
id bigint primary key generated always as identity,
|
||||||
type_titulaire TEXT CHECK (type_titulaire IN ('individu', 'société')) NOT NULL,
|
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
|
BEFORE INSERT ON societe
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
EXECUTE FUNCTION auto_titulaire_morale();
|
EXECUTE FUNCTION auto_titulaire_morale();
|
||||||
|
*/
|
||||||
|
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
-- Comptes (Accounts)
|
-- Comptes (Accounts)
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
|
||||||
|
/*
|
||||||
create table bank.account (
|
create table bank.account (
|
||||||
id bigint primary key generated always as identity,
|
id bigint primary key generated always as identity,
|
||||||
account_number text unique not null,
|
account_number text unique not null,
|
||||||
@@ -576,10 +584,11 @@ BEGIN
|
|||||||
END LOOP;
|
END LOOP;
|
||||||
END;
|
END;
|
||||||
$$ LANGUAGE plpgsql;
|
$$ LANGUAGE plpgsql;
|
||||||
|
*/
|
||||||
|
|
||||||
-- Transactions
|
-- Transactions
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
/*
|
||||||
CREATE TABLE bank."transaction" (
|
CREATE TABLE bank."transaction" (
|
||||||
id UUID PRIMARY KEY DEFAULT uuidv7(),
|
id UUID PRIMARY KEY DEFAULT uuidv7(),
|
||||||
reference TEXT,
|
reference TEXT,
|
||||||
@@ -705,7 +714,7 @@ CREATE TRIGGER tr_notify_transaction
|
|||||||
AFTER INSERT ON bank.transaction
|
AFTER INSERT ON bank.transaction
|
||||||
FOR EACH ROW
|
FOR EACH ROW
|
||||||
EXECUTE FUNCTION notify_transaction();
|
EXECUTE FUNCTION notify_transaction();
|
||||||
|
*/
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
-- Business Intelligence
|
-- Business Intelligence
|
||||||
-- ----------------------------------------------------------------------
|
-- ----------------------------------------------------------------------
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ truncate table fournisseur;
|
|||||||
\COPY fournisseur FROM '/tmp/fournisseur.csv' (FORMAT CSV, header, ENCODING 'UTF8');
|
\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 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 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');
|
\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[4]);
|
||||||
SELECT bank.insert_account_random(ARRAY[5],'USD');
|
SELECT bank.insert_account_random(ARRAY[5],'USD');
|
||||||
SELECT bank.insert_account_random(ARRAY[6,11]);
|
SELECT bank.insert_account_random(ARRAY[6,11]);
|
||||||
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user