This commit is contained in:
2025-11-02 16:21:22 +01:00
parent ace5f22f93
commit 5cdf802bba
4 changed files with 58 additions and 8 deletions

View File

@@ -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 nn 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.

View File

@@ -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 dinsérer une person sans holder ? 3. Quelle contrainte empêche dinsé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 dun 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 dun numéro de compte (_account number_) unique et dun solde. - Un compte bancaire doit pouvoir appartenir à un ou plusieurs titulaires (compte individuel / compte joint).
- Chaque compte dispose dun numéro de compte (_account number_) unique, dun 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.

View File

@@ -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
-- ---------------------------------------------------------------------- -- ----------------------------------------------------------------------

View File

@@ -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]);
*/