Utilisation de triggers avec l'argument instead of
1 réponse
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?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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: ******************
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:brouardf@club-internet.fr ******************
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: ******************