Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2137 connectés 

 


Dernière réponse
Sujet : Trigger sous Sqlserver
dinbougre888 :bounce:

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


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

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.

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

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

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

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.

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 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?

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

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.

dinbougre888 :(

 

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

dinbougre888

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:

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 :

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

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?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)