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

  FORUM HardWare.fr
  Programmation

  Trigger sous Sqlserver

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Trigger sous Sqlserver

n°77684
dinbougre8​88
Posté le 03-12-2001 à 15:51:43  profilanswer
 

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?

mood
Publicité
Posté le 03-12-2001 à 15:51:43  profilanswer
 

n°77689
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 16:06:07  profilanswer
 

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
n°77696
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 16:17:45  profilanswer
 

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
n°77697
dinbougre8​88
Posté le 03-12-2001 à 16:18:26  profilanswer
 

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:

n°77699
dinbougre8​88
Posté le 03-12-2001 à 16:20:29  profilanswer
 

:(

 

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

n°77702
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 16:26:45  profilanswer
 

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
n°77704
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 16:27:27  profilanswer
 

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
n°77705
dinbougre8​88
Posté le 03-12-2001 à 16:29:28  profilanswer
 

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?

n°77708
dinbougre8​88
Posté le 03-12-2001 à 16:34:00  profilanswer
 

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

n°77712
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 16:45:04  profilanswer
 

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
mood
Publicité
Posté le 03-12-2001 à 16:45:04  profilanswer
 

n°77713
dinbougre8​88
Posté le 03-12-2001 à 16:47:11  profilanswer
 

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

n°77714
dinbougre8​88
Posté le 03-12-2001 à 16:47:11  profilanswer
 

:heink:

 

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

n°77716
dinbougre8​88
Posté le 03-12-2001 à 16:59:52  profilanswer
 


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:

n°77717
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 17:04:23  profilanswer
 

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
n°77718
dinbougre8​88
Posté le 03-12-2001 à 17:06:24  profilanswer
 

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

n°77720
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 17:11:14  profilanswer
 

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
n°77722
dinbougre8​88
Posté le 03-12-2001 à 17:13:48  profilanswer
 

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

n°77723
dinbougre8​88
Posté le 03-12-2001 à 17:14:11  profilanswer
 

:cry: v mourrire sur ce prgm

n°77724
instantdha​rma
Ailleurs c'est ici
Posté le 03-12-2001 à 17:20:19  profilanswer
 

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
n°77726
dinbougre8​88
Posté le 03-12-2001 à 17:22:33  profilanswer
 


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

n°77727
dinbougre8​88
Posté le 03-12-2001 à 17:23:30  profilanswer
 

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

n°77917
dinbougre8​88
Posté le 04-12-2001 à 10:34:21  profilanswer
 


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

n°77950
dinbougre8​88
Posté le 04-12-2001 à 11:20:03  profilanswer
 

pliz ça urge  :cry:

n°78046
dinbougre8​88
Posté le 04-12-2001 à 13:52:59  profilanswer
 

revient instantdharma  :cry:

n°78190
dinbougre8​88
Posté le 04-12-2001 à 17:15:42  profilanswer
 

:bounce:

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Trigger sous Sqlserver

 

Sujets relatifs
[Access/SQLServer] Fonctions equivalentes a DATEDIFF() et GETDATE() ?[SQL SERVER] Debuger un trigger
concevoir un système de votes sur des photos / ASP-SQLSERVERdifférence entre sqlserver ....
[VB,SQLServer] texte avec cotesqlserver
[ASP ADO][SQLSERVER] pb dans le format date[SQL] Trigger pour empecher d'inserer une valeur
newbie en BD demande différence entre Procédure Stockée et Trigger ...éxecution d'un vbs par sqlserver avec whs
Plus de sujets relatifs à : Trigger sous Sqlserver


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