[SQL Server 2005] Tri sur données entrantes

Résolu
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 - 30 mai 2011 à 11:39
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 - 1 juin 2011 à 09:49
Bonjour je crée actuellement une base de donnée enregistrant toutes les actions effectuées sur un logiciel de supervision. Cependant, seul une partie de ces infos m'intéresse. Ma base commençant à avoir une taille conséquente je me demandais si il était possible de faire des tris sur les données entrantes c'est à dire que par exemple ne pas enregistrer les données où un champs contient certains mots clé et également de supprimer les messages vieux de x années.

Bonne journée

19 réponses

cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
30 mai 2011 à 12:27
Salut,

Pour supprimer les messages de x années il suffit de faire un delete avec une clause where sur les dates d'enregistrement (à toi de voir suivant ton modèle).

Pour conditionner l'insertion de tuple il te faudra utiliser un trigger (déclencheur) sur cette action. Pour plus d'info voici le tuto de sqlfr.com sur le sujet.

Bon SQL
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 08:54
Re,

comment as-tu réussi à ne pas trouver d'exemple pour les TRIGGER sur le net ? ^^
La fiche très complète sur les TRIGGER pour SQL Server 2005 d'après la MSDN.
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 14:08
Pour les DateTime il faut voir ces deux fonctions :
- GETDATE : permet d'avoir la date courante (aujourd'hui en somme),
- DATEDIFF(datepart, startdate, enddate) : permet de calculer la différence entre deux dates.

Avec ça tu auras les billes pour faire la différence entre la date d'insertion de l'enregistrement et la date courante, et ainsi faire la clause WHERE de ton DELETE avec cette différence supérieure à 7 ans.
3
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 15:53
Ta requête me parait pas mal (*) par contre je l'aurai pas mise dans le TRIGGER, je l'aurais balancée à la mano en oneshot. Mais du coup je ne comprends pas bien ton dernier problème.

(*) deux choses à voir :
- inverse GETDATE() et Champ_date, sinon tu vas travailler sur des chiffres négatifs,
- DATEDIFF fait une différence un peu pourrie (faut pas se le cacher), par exemple : DATEDIFF(year, '31-12-2010', '01-01-2011') va renvoyer "1 an" alors que dans les faits il n'y a qu'un jour entre les deux dates.
3

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 08:15
Merci pour le tuto, celui ci est très explicite, cependant comment créer un trigger sur sql server je n'ai pas trouvé ça sur le net et je n'ai pas l'aide sur mon sql server 2005 ?

Merci d'avance.
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 08:58
Dans l'arborescence je ne peux pas créer des "database trigger". J'ai donc créer un trigger manuellement avec la console :

CREATE TRIGGER Supress
ON Ma_Table

AFTER INSERT

as

Delete FROM Ma_Table Where champ1 like '%mots_clé1%' or champ1 like '%mots_clé2%'


Cependant quand j'exécute mon code j'ai ce message d'erreur :
Msg 9001, level 21, State 1, Procédure supress, Line 8
Le journal de la base de données "ma_base" n'est pas disponible. Consultez le journal des évènements pour voir s'il contient des messages d'erreurs.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 09:12
Alors là ...

Et tu as tenté de "consulter le journal des événements pour voir s'il contient des messages d'erreur liés à ce problème" et de "résoudre toutes les erreurs et redémarrez la base de données" ?

Sinon à vue de nez ton SQL parait correc'
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 09:20
ça viens de ma base puisque j'ai essayé sur une autre et ça marchais parfaitement ^^.


Mais ce trigger va t'il réellement se déclencher automatiquement ?
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 09:26
Ah oui, il va se déclencher automatiquement "après une insertion dans la table Ma_Table", c'est sa définition.
Pour avoir pas mal usé de ce mécanisme sous Oracle, c'est quelque chose de plutôt sûr et franchement pratique ;)
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 09:32
Ok ça marche, je teste ça et je te tiens au courant. Merci pour ton aide
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 11:29
Bon eh bien bizarrement ça a marché juste pour le mots clé 1 et maintenant mes enregistrements se font dans le désordre total et de plus mon trigger ne fonctionne plus
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 12:11
N'ayant pas d'environnement de test je vais pas pouvoir t'aider plus.

La syntaxe (hors spécificité des noms de table et de champ) et la logique de ton TRIGGER me semblent correctes.

A la rigueur tu peux regarder si le fonctionnement de ton TRIGGER ne rentre pas en conflit avec le fonctionnement d'autres TRIGGER déjà en place.
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 13:34
Je n'ai pas d'autre Trigger en place donc je ne pense pas que cela vienne d'un conflit =S.


Par comment dans le trigger comment pourrais je faire une comparaison de date car je voudrai supprimer automatiquement les données vieilles de 7ans et j'ai un champ dédié à la date d'entrée de l'enregistrement cependant il est au format DateTime.
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 15:41
J'ai écris dans mon trigger :


[code=autre]CREATE TRIGGER Supress_date
ON Ma_Table

AFTER INSERT

as

Delete FROM Ma_Table Where (DATEDIFF(yyyy, GETDATE(), Champ_date) >7)


Je ne sais pas comment affecter la valeur qui est soustrait à la valeur GETDATE() (Celle ci doit être la valeur de mon champ Champ_Date)


On y est presque .
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 16:29
Ok c'est bon ça marche nikel =), en fait vu que j'inversais getdate et champ_date j'obtenais une valeur négative donc je ne supprimais rien. Par contre j'ai vraiment l'impression que mes triggers ne se déclenchent pas je pense mal faire la procédure.

Pour créer mon trigger sous sql server express 2005 je fais new query puis j'entre mon code vu plus haut. Sauf que lorsque ma base reçois des enregistrements, mon trigger ne se déclenche pas =S
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 16:38
Faut déjà que je te dise un truc : j'ai jamais bossé avec SQL Server, je connais assez bien le SQL pour avoir fait beaucoup d'Oracle (dont Oracle Forms) et pas mal de MySQL. Du coup je sais pas à quoi ressemble l'interface du client SQL Server. D'ailleurs j'utilise surtout Toad ("for Oracle" ou "for MySQL").

Lorsque tu as copié puis exécuter le CREATE TRIGGER, tu as eu un message comme quoi le script était bien passé ? Y'a-t-il un affichage où tu peux voir toutes les infos d'une table, voir si ton TRIGGER y est bien référencé ?
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
31 mai 2011 à 16:50
En fait ça marche il faut bien vérifier en fesant clic droit sur la table et "view dependencies" si le trigger est bien associé
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
31 mai 2011 à 16:57
Donc ton TRIGGER est bien passé, mais il semble ne pas être joué, c'est ça ?
Ou bien maintenant ça fonctionne correctement ?
0
pitipilot Messages postés 112 Date d'inscription mercredi 19 mai 2010 Statut Membre Dernière intervention 14 mai 2021 1
1 juin 2011 à 09:49
J'avais vêtement oublié de finir mon instruction par des "GO" voilà pourquoi ^^. En tout cas merci beaucoup à toi tu m'as vraiment bien aidé .

Bonne journée
0
Rejoignez-nous