Bonsoir Ordigil,
Si vous mettez en oeuvre le trigger TRUCK_OIL_CHANGE_V_INSERT_TR, c’est que vous voulez effectuer des inserts via la vue TRUCK_OIL_CHANGE_V, donc par ce biais mette à jour la table OIL_CHANGE, c’est ce que dit l’INSERT final dans le trigger. So far, so good.
Mais...
(1) Notez que l’instruction END balançant l’instruction BEGIN de début de trigger n’est plus à sa place, elle est partie malencontreusement devant l’instruction "SET @ComponentType".
(2) Passons à cette instruction elle-même :
SET @ComponentType =
(
SELECT ComponentType
FROM Component AS x
WHERE EXISTS
(
SELECT '' FROM INSERTED AS u
WHERE x.ComponentType = u.ComponentType
)
)
;
"x.ComponentType" prend les valeurs 'e', 't', 'a', , 'd', tandis que "u.ComponentType" prend les valeurs 'engine', 'transmission', 'axle', 'differential'... Autrement dit, SQL force @ComponentType à NULL...
(3) Passons à l’instruction :
SET @ComponentId =
(
SELECT ComponentId
FROM COMPONENT_AFFECTATION AS x
WHERE EXISTS
(
SELECT '' FROM INSERTED AS u
WHERE x.LocalisationId = LocalisationId
)
)
;
La variable @ComponentId ne peut prendre au plus qu’une valeur, sinon SQL rouspète grave. Or si un camion a par exemple, un moteur et une transmission, la variable prendra deux valeurs, d’où infraction... Vous êtes obligé de faire intervenir le composant dans le 2e WHERE, sachant par ailleurs que la comparaison "x.LocalisationId = LocalisationId" est une tautologie, elle équivaut à "x.LocalisationId =
x.LocalisationId" (LocalisationId n’est pas une colonne de INSERTED, mais bien de COMPONENT_AFFECTATION).
Dans les tests, je vous conseille de tracer les valeurs prises par les variables, exemples :
select TruckId as 'TruckId'
...
select @TruckVIN as '@TruckVIN'
Etc.
Même chose pour INSERTED :
select '' as INSERTED, * from INSERTED
Je vais voir comment effectuer les INSERTs de façon satisfaisante...
Partager