Envoyé par
ordigil
Il y a encore plus que votre schéma qui est impliqué dans la création d'un nouveau camion. Si je ne demande pas à l'utilisateur d'entrer le vendeur du camion lors de la création d'un nouveau camion, ce camion ne sera jamais référencé par un vendeur.
Autrement dit, la règle de gestion est la suivante :
« Quel que soit le camion, on doit savoir à qui il a été acheté ».
Dans ces conditions, je modifie la vue CAMION_LOCALISATION_V en sorte qu’y figure le nom du vendeur (colonne Seller). Si l’utilisateur fournit ce nom, alors le trigger CAMION_LOCALISATION_INSERT_TR mettra à jour la table CONTACT (colonne ContactName := nom du vendeur, type de contact = 'Anonymous') :
CREATE VIEW CAMION_LOCALISATION_V
(
VIN, Number, Immat
, DateMfg, DateAchat, DateSold
, Manufacturer, Model
, Seller
, ContactType
, WheelBase, Color
, USDOT, ICCMC, GVWR
, Note
)
AS
SELECT CamionVIN, CamionNumber, CamionImmat
, CamionDateMfg, CamionDateAchat, CamionDateVente
, t.ContactName, TruckModelName
, COALESCE(v.ContactName, '-')
, COALESCE(ContactTypeName, '-')
, CamionWheelBase, CamionColor
, USDOT, ICCMC, GVWR
, LocalisationNote
FROM CAMION AS x JOIN LOCALISATION AS y ON x.CamionId = y.LocalisationId
JOIN TRUCK_MODEL AS z ON x.TruckManufacturerId = z.TruckManufacturerId
AND x.TruckModelId = z.TruckModelId
JOIN CONTACT AS t ON z.TruckManufacturerId = t.ContactId
LEFT JOIN TRUCK_PURCHASE As u ON u.truckid = x.CamionId
LEFT JOIN CONTACT AS v ON v.ContactId = u.ContactId
LEFT JOIN CONTACT_TYPE as w ON w.ContactTypeId = v.ContactTypeId
;
Aménagement du trigger CAMION_LOCALISATION_INSERT_TR :
Si le nom du vendeur est fourni dans l’INSERT portant sur la vue CAMION_LOCALISATION_V et si ce nom n'existe pas dans la table CONTACT (colonne ContactName), on l'insère dans la table CONTACT avec le type 'Anonymous'. Dans tous les cas, si le nom du vendeur est fourni on met à jour la table TRUCK_PURCHASE. Si le nom du vendeur n’est pas fourni dans l’INSERT portant sur la vue CAMION_LOCALISATION_V, on ne met à jour ni la table CONTACT ni la table TRUCK_PURCHASE (dans ce dernier cas, on met quand même à jour la table CAMION, mais peut-être préféreriez-vous qu’on ne le fasse pas et qu’à la place on se contente d’afficher un message d’erreur ?)
Exemple :
L’utilisateur crée le camion de VIN 'vin01' et propose 'Dubicobit' en tant que vendeur. Celui-ci n’existe pas en tant que contact, on le crée dans la table CONTACT et on met à jour la table TRUCK_PURCHASE.
L’utilisateur crée le camion de VIN 'vin02' et propose 'Dubicobit' en tant que vendeur. Celui-ci existe déjà en tant que contact, on se limite à la mise à jour de la table TRUCK_PURCHASE.
L’utilisateur crée le camion de VIN 'vin03' et ne propose pas de vendeur. On ne touche ni à la table CONTACT ni à la table TRUCK_PURCHASE.
Jeu d’essai :
INSERT INTO CAMION_LOCALISATION_V (VIN, Immat, DateAchat
, Manufacturer, Model, Number
, Seller)
SELECT 'vin01', 'immat01', '2012-07-01'
, 'Leclerc Manufacturier', 'Modèle Bozo', '314'
, 'Dubicobit'
;
INSERT INTO CAMION_LOCALISATION_V (VIN, Immat, DateAchat
, Manufacturer, Model, Number
, Seller
, Color, Note)
SELECT 'vin02', 'immat02', '2015-07-05'
, 'Leclerc Manufacturier', 'Modèle Mac Pherson', '324'
, 'Dubicobit'
, 'fraise', 'Mon beau camion à moi'
;
INSERT INTO CAMION_LOCALISATION_V (VIN, Immat, DateAchat
, Manufacturer, Model, Number
, Color, Note)
SELECT 'vin03', 'immat03', '2016-04-01'
, 'Leclerc Manufacturier', 'Modèle Petit Pierre', '330'
, 'jaune', 'dur à vendre !'
;
;
=>
Table CAMION
CamionId CamionVIN ...
-------- --------- ---
1910 vin01 ...
1911 vin02 ...
1912 vin03 ...
Vue CAMION_LOCALISATION_V
VIN Number Seller SellerType ...
--- ----- ----- ---------- ---
vin01 314 Dubicobit Anonymous ...
vin02 324 Dubicobit Anonymous ...
vin03 330 – –
Table CONTACT
ContactId ContactName ContactTypeId ...
--------- ----------- ------------- ---
1347 Dubicobit 4 ...
Table TRUCK_PURCHASE
TruckId ContactId
------- ---------
1910 1347
1911 1347
Partager