OVH Cloud OVH Cloud

Utilisation de triggers avec l'argument instead of

1 réponse
Avatar
Hervé RESCOURIO
Je souhaite avoir la possibilité de modifier la composante d'une clé externe
avant le contrôle d'intégrité en insertion et en mise à jour d'un
enregistrement

Exemple : Dans le cas suivant, Si le champ IdAbonne = 0 de la table
Abonnement est égale à zero, je souhaite qu'il prenne la valeur Null avant
le contrôle d'intégrité.

create table "ABONNEMENT" (
"IDABONNEMENT" int ,
"IDABONNE" int ,
primary key ("IDABONNEMENT")
);

create table "PERSONNE" (
"IDPERSONNE" int not null ,
primary key ("IDPERSONNE")
);

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_PERSONNE" foreign key ("IDABONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete no action;

Avec le trigger suivant, cela marche parfaitement en mise à jour.

CREATE TRIGGER ABONNEMENT_SetCompCleExtNull On [dbo].[ABONNEMENT]
INSTEAD Of Update
As
IF NOT UPDATE(IDABONNE)
RETURN
UPDATE ABONNEMENT
SET IDABONNE = CASE WHEN I.IDABONNE = 0 THEN null ELSE I.IDABONNE END
FROM ABONNEMENT O INNER JOIN INSERTED I ON I.IDABONNEMENT=O.IDABONNEMENT;

Maintenant je ne vois pas du tout comment faire pour traiter le cas de
l'insertion?


Merci pour toutes vos suggestions

1 réponse

Avatar
Fred BROUARD
Cela n'est pas possible. En effet pour cela il faudrait pouvoir utiliser
un trigger BEFORE INSERT. Or SQL Server n'en possède pas.

Il faut faire autrement !

A +

Hervé RESCOURIO a écrit:
Je souhaite avoir la possibilité de modifier la composante d'une clé externe
avant le contrôle d'intégrité en insertion et en mise à jour d'un
enregistrement

Exemple : Dans le cas suivant, Si le champ IdAbonne = 0 de la table
Abonnement est égale à zero, je souhaite qu'il prenne la valeur Null avant
le contrôle d'intégrité.

create table "ABONNEMENT" (
"IDABONNEMENT" int ,
"IDABONNE" int ,
primary key ("IDABONNEMENT")
);

create table "PERSONNE" (
"IDPERSONNE" int not null ,
primary key ("IDPERSONNE")
);

alter table "ABONNEMENT"
add constraint "FK_ABONNEMENT_PERSONNE" foreign key ("IDABONNE")
references "PERSONNE" ("IDPERSONNE")
on update cascade on delete no action;

Avec le trigger suivant, cela marche parfaitement en mise à jour.

CREATE TRIGGER ABONNEMENT_SetCompCleExtNull On [dbo].[ABONNEMENT]
INSTEAD Of Update
As
IF NOT UPDATE(IDABONNE)
RETURN
UPDATE ABONNEMENT
SET IDABONNE = CASE WHEN I.IDABONNE = 0 THEN null ELSE I.IDABONNE END
FROM ABONNEMENT O INNER JOIN INSERTED I ON I.IDABONNEMENT=O.IDABONNEMENT;

Maintenant je ne vois pas du tout comment faire pour traiter le cas de
l'insertion?


Merci pour toutes vos suggestions







--
Frédéric BROUARD - expert SQL, spécialiste : SQL Server / Delphi / web
Livre SQL - col. Référence : http://sqlpro.developpez.com/bookSQL.html
Le site du SQL, pour débutants et pros : http://sqlpro.developpez.com
****************** mailto: ******************