Trigger before delete

cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 - 24 août 2006 à 09:48
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 - 29 août 2006 à 14:09
Bonjour,

Je souhaite créé un trigger sur la suppression d'enregistrement d'un table T1. Un table T2 est lié avec T1 par une référence de clé étrangère.
Je dois donc modifier T2 avant de supprimer l'enregistrement de T1.
En résumé, je dois faire un trigger sur un BEFORE UPDATE.
Comment connaitre l'enregistrement qui va être supprimé afin de modifier T2 ?
Avez-vous un exemple?

Merci de vos réponses.

Théo

15 réponses

cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
24 août 2006 à 09:55
Bonjour,

Les triggers BEFORE n'existent pas sur SQL Server, au mieu il y a les triggers INSTEAD OF.

Dans le cas présent (pour supprimer en cascade des enregistrements) il y a une solution qui est déjà prévu par Microsoft sur SQL Server depuis la version 2000 :

CREATE TABLE FACTURE
(
FAC_ID int not null identity(1,1) primary key,
CLI_ID int not null ,
FAC_MANTANT Money,
CONSTRAINT [FK_FACTURE_CLIENT] FOREIGN KEY
(
[CLI_ID]
) REFERENCES [CLIENT] (
[CLI_ID]
) ON DELETE CASCADE
);

On a créée une table facture liée à client, et on demande à propager les suppressions en cas de DELETE dans la table client.

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
24 août 2006 à 10:10
Merci pour ta réponse,

Celà colle pas tout à fait a mes besoins.

Pour simplifier, j'ai une table Personne qui à une colonne IdClassement. J'ai une table Classement avec des enreg du type idClassement, libelleClassement. et je voudrais lorsque l'on supprime un enreg de  classement mettre à jour ma colonne  IdClassement de personne à null.
Personne.IdClassement st liée par contrainte de clé étrangère à Classement.IdClassement.

Théo
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
24 août 2006 à 10:43
De rien :o)
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
26 août 2006 à 18:30
il ya d'auter option que CASCADE : il ya SET NULL et SET DEFAULT :

CREATE TABLE FACTURE
(
FAC_ID int not null identity(1,1) primary key,
CLI_ID int not null ,
FAC_MANTANT Money,
CONSTRAINT [FK_FACTURE_CLIENT] FOREIGN KEY
(
[CLI_ID]
) REFERENCES [CLIENT] (
[CLI_ID]
) ON DELETE SET NULL 
);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
28 août 2006 à 13:58
Lrosque j'ajoute en fin de la description de ma contrainte 'On delete set null' , j'ai le message d'erreur suivant: Syntaxe incorrecte vers le mot clé 'set'

Est ce que cette commande est gérée par SQL Express ?
Voici ma commande.
ALTER TABLE PATIENTS ADD constraint [FK_PATIENTSCLASS_IdPatientClas] FOREIGN KEY ([IdPatientClass]) REFERENCES [PATIENTSCLASS] ([IdPatientClass]) on delete set null;

Théo
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
28 août 2006 à 14:02
Je pense que ca aurait du marché je vais voir si je trouve autre chose (pour les triggers tu peux trouver des infos dans les tutorials ).
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
28 août 2006 à 14:08
Merci pour ton aide,

En ce qui concerne la syntaxe, j'ai vérifié sur l'aide du transact-SQL et elle me semble correcte. Pour l'utilisation des triggers, le pb est que la mise à null de mes champs doit  être faite avant la suppression de l'enregistrement donc la table deleted n'est pas encore générée.

Théo
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
29 août 2006 à 11:48
Les SET DEFAULT et SET NULL ne sont supportés que par SQL Server 2005 (Express aussi)

La syntaxe :
ALTER

TABLE PATIENTS
ADD
constraint [FK_PATIENTSCLASS_IdPatientClas]
FOREIGN
KEY
([IdPatientClass]
)
REFERENCES [PATIENTSCLASS]
([IdPatientClass]
)
on
delete
set
null;Fonctionne sans problèmes chez moi.

Tu es sûr de ta version ?

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
29 août 2006 à 12:01
Il s'agit d'une version migrée de MSDE vers SQLExpress. Comment puis-je vérifier la version ?

Théo
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
29 août 2006 à 12:06
SELECT @@VERSION

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
29 août 2006 à 12:08
Voilà ce que j'ai en retour

 Microsoft SQL Server  2000 - 8.00.760 (Intel X86)
        Dec 17 2002 14:22:05
        Copyright (c) 1988-2003 Microsoft Corporation
        Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 2)

Je pense que la migration n'a pas du ce faire correctement ?
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
29 août 2006 à 12:13
Je pense aussi...


Si çà se trouve il a installé les 2 côte à côte... c'est à dire MSDE et EXPRESS installé...


A mon avis la MSDE a l'instance par défaut... Le nom de la machine (par ex SERVEUR). Et l'Express un nom d'instance : SERVEUR\SQLEXPRESS

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
cs_Malkuth Messages postés 268 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 24 avril 2013 4
29 août 2006 à 12:18
Je ne sait pas si c'est c'est mais il me semble que SQL server 2005 gere un niveau de compatibilité des base de donnée, peut être que ta base de donnée est en mode de compatibilité SQL 2000

Si, tu as SQL Management Studio pour 2005 tu fais un click droit sur la base de donnée dans l'exploreteur de base de donnée, tu choisi propriété dans le popup ensuite tu vas dans la section option et tu vérifie la valeur de l'option : compaztibility level si besion est tu la modifie en : sql server 2005 (90).

en espérant que se soit ca. je réitère ce que je te disait hier sur les triger je me suis cassez les pied a faire une tutos la dessus elle vaux se qu'elle vaut mais a peut de chose près il ya un exemple de ton cas mais comme christiant je te conseil de tout essayé pour passer par les modes automatique de sql server (cascade,set null ou set default) car c'est beaucoup plus rapide et ca évite de faire du code qu'il faut maintenir.
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
29 août 2006 à 13:49
Le @@version c'est définitivement la version du serveur.
Rien à voir avec le niveau de compatibilité de la base de données.

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
cs_RMI Messages postés 305 Date d'inscription vendredi 18 juillet 2003 Statut Membre Dernière intervention 2 août 2010 2
29 août 2006 à 14:09
Merci pour vos interventions.
C'est très, très sympa, je vais réinstaller SQLExpress.

Théo
0
Rejoignez-nous