SQL Server

cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010 - 17 nov. 2005 à 11:01
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 - 18 nov. 2005 à 11:04
Bonjour,



J'ai un problème sur ma base SQL Server.

J'utilise une grosse base de données et il m'est impossible certaines fois de créer des relations entre différentes tables.

Je fais donc des TRIGGER qui marche à moitier : je m'explque :

Lorsque je modifie un champ d'une table, la modification se repporte sur les tables liées par le trigger.

Mais lorsque je veux supprimer, je voudrais que si l'élément que je
supprime est deja référencé dans une table liée, il ne la supprime pas.



Par exemple, un employé créé un test. La référence de cet employé va etre dans la table test.

Donc lorsque je veux le supprimer, vu qu'il est dans un test en cours, il ne le supprime pas.



Mon trigger qui marche pour lupdate est celui ci :



<hr size="2" width="100%">CREATE TRIGGER TabPFEmployes_UTrig ON TabPFEmployes FOR UPDATE AS

SET NOCOUNT ON

/* * MISES À JOUR EN CASCADE VERS 'Essais' */

IF UPDATE(RefEmploye)

BEGIN

UPDATE Essais

SET Essais.Employe = inserted.RefEmploye

FROM Essais, deleted, inserted

WHERE deleted.RefEmploye = Essais.Employe



END

<hr size="2" width="100%">

Est-ce que quelqu'un sait quoi rajouter pour faire ce que je voudrais ?



Merci beaucoup.

3 réponses

aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
17 nov. 2005 à 15:02
salut

premiere chose, tu dis que tu travaille sur une grosse base de données.

je ne sais pas pas ce que tu stocke, mais pour SQL server, j'estime que si tu n'a pas plusieurs dizaines voire centaines de giga de données, ca n'est pas une "grosse" base... en tout ca ca ne devrait pas t'empecher de créer des contraintes d'intégrité referentielles... essaie peut etre de preciser ton probleme pour la création de ces clef, le probleme vient sans doute d'ailleurs.

sinon pour ce qui est de ton probleme de trigger, tu fait un trigger de type ON UPDATE,
pour faire un controle lors de la suppression d'une ligne dans la table, que tu devrais faire un type INSTEAD OF DELETE.
0
cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
17 nov. 2005 à 19:20
Ma base fait pres de 80Mo et contient de nombreuses relations.
Je pense que c'est toutes ces relations ensembles qui font qu'il y a des conflits pour la création de certaines.
Je te dirais exactement quel est le message d'erreur demain.

Pour ce qui est du trigger, je connais la commande ON DELETE mais, justement sur un delete d'un employé par exemple, il ne faut pas qu'il soit supprimé si la reference de cet employé existe dans un test. Et c'est ca (empecher le delete de l'employé) que je ne c pas faire.
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
18 nov. 2005 à 11:04
tu as peut etre des conflits pour créer des relations avec l'option CASCADE

dans ce cas en effet tu ne peut pas créer de 'boucle' de suppression. par exemple si tu as deux tables, tu ne peux pas specifier un delete cascade de la table A vers la table B, et un autre de la B vers la A.
idem avec trois tables.

car sinon le systeme ferait une boucle infinie

donc dans ce cas il faut gerer ca par un trigger. tu pourrai avoir le meme probleme (un trigger A declenche un trigger B, qui redeclenche le A...) sauf que dans le cas des triggers, tu peux définir le nombre maximum d'imbrication (avec la variable NESTED_TRIGGER de memoire...) par defaut je crois meme qu'il est a 0 : un trigger ne peut pas en declencher un autre !)

et pour faire ca avec un trigger ?
tu fais un trigger INSTEAD OF DELETE, et si un enregistrement corrspondant a la ligne supprimee existe dans une autre table, tu annule la suppression en faisant un ROLLBACK (et eventuellement un RAISE ERROR pour spécifier a ton application que la suppression n'a pas eu lieu)

voici le lien vers les MSDN sur les triggers, il y a un exemple de trigger pour le controle d'integrité :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_create2_7eeq.asp
0
Rejoignez-nous