[SQL Server 2005] Tri sur données entrantes [Résolu]

pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 30 mai 2011 à 11:39 - Dernière réponse : pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention
- 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
Afficher la suite 

Votre réponse

19 réponses

cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 30 mai 2011 à 12:27
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 08:54
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 14:08
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 15:53
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_jopop
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 08:15
0
Utile
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.
Commenter la réponse de pitipilot
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 08:58
0
Utile
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.
Commenter la réponse de pitipilot
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 09:12
0
Utile
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'
Commenter la réponse de cs_jopop
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 09:20
0
Utile
ç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 ?
Commenter la réponse de pitipilot
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 09:26
0
Utile
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 ;)
Commenter la réponse de cs_jopop
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 09:32
0
Utile
Ok ça marche, je teste ça et je te tiens au courant. Merci pour ton aide
Commenter la réponse de pitipilot
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 11:29
0
Utile
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
Commenter la réponse de pitipilot
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 12:11
0
Utile
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.
Commenter la réponse de cs_jopop
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 13:34
0
Utile
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.
Commenter la réponse de pitipilot
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 15:41
0
Utile
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 .
Commenter la réponse de pitipilot
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 16:29
0
Utile
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
Commenter la réponse de pitipilot
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 16:38
0
Utile
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é ?
Commenter la réponse de cs_jopop
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 31 mai 2011 à 16:50
0
Utile
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é
Commenter la réponse de pitipilot
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 31 mai 2011 à 16:57
0
Utile
Donc ton TRIGGER est bien passé, mais il semble ne pas être joué, c'est ça ?
Ou bien maintenant ça fonctionne correctement ?
Commenter la réponse de cs_jopop
pitipilot 111 Messages postés mercredi 19 mai 2010Date d'inscription 2 juin 2015 Dernière intervention - 1 juin 2011 à 09:49
0
Utile
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
Commenter la réponse de pitipilot

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.