Trigger sous Sqlserver

Trigger sous Sqlserver - Programmation

Marsh Posté le 03-12-2001 à 15:51:43    

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?

Reply

Marsh Posté le 03-12-2001 à 15:51:43   

Reply

Marsh Posté le 03-12-2001 à 16:06:07    

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 :

Code :
  1. select  @numrows = @@rowcount
  2. if @numrows > 1
  3.   begin
  4.     rollback trigger with raiserror ...
  5.     return
  6.   end


inconvénient : on peut pas supprimer +sieurs ligs à la fois. C'est pas joli.
2e solution : jointure avec deleted pour la suppression + tôt que passer par un select pour avoir la clé.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 16:17:45    

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.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 16:18:26    

instantdharma a écrit a écrit :

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 :

Code :
  1. select  @numrows = @@rowcount
  2. if @numrows > 1
  3.   begin
  4.     rollback trigger with raiserror ...
  5.     return
  6.   end


inconvénient : on peut pas supprimer +sieurs ligs à la fois. C'est pas joli.
2e solution : jointure avec deleted pour la suppression + tôt que passer par un select pour avoir la clé.  




 
en fait je dois supprimer plusieurs ligne dans T_ROLE mais parfois 0 ou 1 ligne. C vré ke VB me retourne ke y a trop de ligne affecté.
comment je dois faire avec ta méthode de jointure?
eske tu peux me faire le code, j'en peux plus j'y suis depuis ce matin  :cry:

Reply

Marsh Posté le 03-12-2001 à 16:20:29    

:(

 

[edtdd]--Message édité par dinbougre888--[/edtdd]

Reply

Marsh Posté le 03-12-2001 à 16:26:45    

Code :
  1. create trigger t_entite_delete on t_entite
  2. for delete 
  3. as 
  4. begin
  5. set @numentite = (select obj_id from deleted)
  6. delete
  7.   t_role
  8. from
  9.   deleted d
  10. ,t_role  t
  11. where t.entite_id = d.obj_id
  12. end


P.S. Ton responsable me semble avoir raison, parce que tes suppressions sont xq sur le serveur et ndépendamment de ton apli cliente.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 16:27:27    

oups, dans le code ci-dessus, le set... ne sert à rien & j'ai oublié de l'enlever.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 16:29:28    

instantdharma a écrit a écrit :

Code :
  1. create trigger t_entite_delete on t_entite
  2. for delete 
  3. as 
  4. begin
  5. set @numentite = (select obj_id from deleted)
  6. delete
  7.   t_role
  8. from
  9.   deleted d
  10. ,t_role  t
  11. where t.entite_id = d.obj_id
  12. end


P.S. Ton responsable me semble avoir raison, parce que tes suppressions sont xq sur le serveur et ndépendamment de ton apli cliente.  




 
ok je v tester de suite et je te tiens au courant
autrement je voudrais savoir kan tu parlais de suppression multiple tu parles pour la ligne :  
delete from t_role where t_role.entite_id = @numentite?
 
ou bien de: set @numentite = (select obj_id from deleted)?
 
sinon pk tu utilises Delete ... from ...
normalement la syntaxe c pas delete from?

Reply

Marsh Posté le 03-12-2001 à 16:34:00    

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 :(

Reply

Marsh Posté le 03-12-2001 à 16:45:04    

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

Code :
  1. where t_role.obj_id = deleted.obj_id


suppression multiple :  la table deleted contient la clé de toutes les ligs à supprimer ds la même transaction. il te faut donc définir avec ta req sql le result set de toutes les ligs à supprimer, de manière déclarative, ce que fait la jointure indiquée. Mon where marche si tu supprimes une ou n lignes d'un coup, c'est toute la puissance du sql.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 16:45:04   

Reply

Marsh Posté le 03-12-2001 à 16:47:11    

instantdharma a écrit a écrit :

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

Code :
  1. where t_role.obj_id = deleted.obj_id


suppression multiple :  la table deleted contient la clé de toutes les ligs à supprimer ds la même transaction. il te faut donc définir avec ta req sql le result set de toutes les ligs à supprimer, de manière déclarative, ce que fait la jointure indiquée. Mon where marche si tu supprimes une ou n lignes d'un coup, c'est toute la puissance du sql.  




 
je me suis rendu compte ke kan il supprime 1 element ds T_ROLE y a pas de pb il me met le msg d'erreur ke kan y a plus d'1 ligne a supprimer

Reply

Marsh Posté le 03-12-2001 à 16:47:11    

:heink:

 

[edtdd]--Message édité par dinbougre888--[/edtdd]

Reply

Marsh Posté le 03-12-2001 à 16:59:52    


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:

Reply

Marsh Posté le 03-12-2001 à 17:04:23    

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.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 17:06:24    

instantdharma a écrit a écrit :

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.  




 
erf connais pas trop moi sql server
la base de donnée c pas moi ki l'ai crée :(
 
en fait ce ki se passe c ke kan je delete un enreg ds t_role il delete donc le truc ke je demande ds VB a savoir le t_entite mais le pb c kil va ensuite sur le prochain enreg de t_entite ds le but de le delete aussi mais c la ke ça plante

Reply

Marsh Posté le 03-12-2001 à 17:11:14    

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


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 17:13:48    

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é)

Reply

Marsh Posté le 03-12-2001 à 17:14:11    

:cry: v mourrire sur ce prgm

Reply

Marsh Posté le 03-12-2001 à 17:20:19    

Code :
  1. create trigger t_entite_delete on t_entite
  2. for delete 
  3. as 
  4. begin
  5. delete
  6. t_role
  7. from
  8. deleted d
  9. ,t_role  t
  10. where t.obj_id = d.obj_id
  11. end


d'après ce que tu me dis, ton code c'est ça.


---------------
di. / www.diredaredare.org - Ailes de la ville
Reply

Marsh Posté le 03-12-2001 à 17:22:33    


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

Reply

Marsh Posté le 03-12-2001 à 17:23:30    

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

Reply

Marsh Posté le 04-12-2001 à 10:34:21    


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

Reply

Marsh Posté le 04-12-2001 à 11:20:03    

pliz ça urge  :cry:

Reply

Marsh Posté le 04-12-2001 à 13:52:59    

revient instantdharma  :cry:

Reply

Marsh Posté le 04-12-2001 à 17:15:42    

:bounce:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed