| |||||
| Dernière réponse | |
|---|---|
| Sujet : Trigger sous Sqlserver | |
| dinbougre888 | :bounce: |
| Aperçu |
|---|
| Vue Rapide de la discussion |
|---|
| dinbougre888 | :bounce: |
| dinbougre888 | revient instantdharma :cry: |
| dinbougre888 | pliz ça urge :cry: |
| dinbougre888 |
CREATE trigger t_entite_delete on t_entite for delete as begin delete t_role from deleted d,t_role t where t.entite_id = d.obj_id end eske kelkun peut m'aider? pk ce code accepte la suppression de 1 ligne mais pas plus d'1 ligne |
| dinbougre888 | T_ROLE.obj_id il ne sert qu'à identifier le role rien de plus alors ke le lien avec T_ENTITE C T_ROLE.entite_id |
| dinbougre888 |
CREATE trigger t_entite_delete on t_entite for delete as begin delete t_role from deleted d,t_role t where t.entite_id = d.obj_id end non c ca c pas t.obj_id = d.obj_id c bien t.entite_id car le t.obj_id il sert juste à identifier le role |
| instantdharma |
|
| dinbougre888 | :cry: v mourrire sur ce prgm |
| dinbougre888 | T_ROLE: obj_id, ..., entite_id, ...
T_ENTITE: obj_id, nom donc T_ROLE.entite_id est une clé etrangere provenant de T_ENTITE dans mon prgm je supprime un enreg de T_ENTITE et je veux kil supprime dans T_ROLE tout ce ki est rattaché à cet entité donc tous les T_ROLE.entite_id = T_ENTITE.obj_id (celui supprimé) |
| instantdharma | donne la description des tables concernées avec les liens de clés étrangères, au lieu de défausser sur le concepteur de la base :D |
| dinbougre888 |
|
| instantdharma | Vérifie ta jointure, pour être sûr d'utiliser la bonne colonne des 2 côtés (cf mon post précédent). A mon avis le pb est là. (obj_id des 2 côtés).
Vérifie que ta table accepte le delete sur un where qui renvoie plusieurs lignes ; je connais sybase sql server mais pas celui de microsoft. 9a peut être interdit ds un trigger de suppression de la table t_role :D dans le PIRE des cas (à éviter, ça bouffe beaucoup de ressource) tu fais un curseur ds le trigger en bouclant sur deleted & en supprimant les ligs une à une. Attention, c'est pas du tout conseillé ; tu peux essayer pour voir. |
| dinbougre888 |
CREATE trigger t_entite_delete on t_entite for delete as begin delete t_role from deleted d,t_role t where t.obj_id = d.obj_id and t.entite_id = d.obj_id end donc mon code devient bien ça non? bah il marche plus du tout là :cry: |
| dinbougre888 | :heink: [edtdd]--Message édité par dinbougre888--[/edtdd] |
| dinbougre888 |
|
| instantdharma | le from indique les tables utilisées dans le where qui définit le critère de sélection des données.
est-ce-que t_entite.t_obj_id c'est la même info que t_role.t_entite_id ? normalement, la clé étrangère dans t_role a le même nom que la clé primaire ds t_entite. ta jointure de suppression est alors
|
| dinbougre888 | voilà g tester et il me met:
"Informations sur la colonne clé insuffisantes ou incorrectes. trop de lignes sont affectés par la mise à jour" mais bon sinon il m'a correctement fais la suppression :( |
| dinbougre888 |
|
| instantdharma | oups, dans le code ci-dessus, le set... ne sert à rien & j'ai oublié de l'enlever. |
| instantdharma |
|
| dinbougre888 | :( [edtdd]--Message édité par dinbougre888--[/edtdd] |
| dinbougre888 |
|
| instantdharma | j'ajoute :
si tu bloques les triggers en mode mono-ligne,toutes les opérations de masse au niveau de la base devront être codées via des curseurs. C'est le principal défaut de la solution 1, qui est peu élégante, pour ne pas dire rasqueuse. Mieux vaut se fendre de triggers qui acceptent plusieurs lignes, même si c'est + de boulot. |
| instantdharma | Salut
ton trigger est bon oui et non :D Si tu as une seule ligne ds deleted, ça marche. Si t'en as plusieurs, ça foire. 2 solutions : 1. solution de base : interdire de supprimer + d'une ligne à la fois ds le trigger :
|
| dinbougre888 | je veux qu'à la suppression d'un enregistrement il me supprime tout ce ki lui est rattaché:
CREATE trigger t_entite_delete on t_entite for delete as begin declare @numentite as int set @numentite = (select obj_id from deleted) delete from t_role where t_role.entite_id = @numentite end donc ds t_role je veux supprimer tous les enreg ki ont le entite_id = à obj_id de l'enreg supprimer eske mon code est bon? |




