Trigger sous Sqlserver - Programmation
Marsh Posté le 03-12-2001 à 16:06:07
Salut
ton trigger est bon oui et non
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 :
|
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é.
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.
Marsh Posté le 03-12-2001 à 16:18:26
instantdharma a écrit a écrit : Salut ton trigger est bon oui et non 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 :
|
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
Marsh Posté le 03-12-2001 à 16:26:45
Code :
|
P.S. Ton responsable me semble avoir raison, parce que tes suppressions sont xq sur le serveur et ndépendamment de ton apli cliente.
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.
Marsh Posté le 03-12-2001 à 16:29:28
instantdharma a écrit a écrit :
|
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?
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
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 :
|
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.
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
|
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
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à
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
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.
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 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
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
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é)
Marsh Posté le 03-12-2001 à 17:20:19
Code :
|
d'après ce que tu me dis, ton code c'est ça.
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
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
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
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?