Trigger before delete

Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
-
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
-
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
A voir également:

15 réponses

Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
7
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
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
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
Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
7
De rien :o)
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
3
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 
);
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
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
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
3
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 ).
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
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
Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
7
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
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Il s'agit d'une version migrée de MSDE vers SQLExpress. Comment puis-je vérifier la version ?

Théo
Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
7
SELECT @@VERSION

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
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 ?
Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
7
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
Messages postés
268
Date d'inscription
samedi 22 février 2003
Statut
Membre
Dernière intervention
24 avril 2013
3
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.
Messages postés
259
Date d'inscription
mercredi 3 mai 2006
Statut
Modérateur
Dernière intervention
11 janvier 2010
7
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
Messages postés
305
Date d'inscription
vendredi 18 juillet 2003
Statut
Membre
Dernière intervention
2 août 2010
2
Merci pour vos interventions.
C'est très, très sympa, je vais réinstaller SQLExpress.

Théo