Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 21/04/2011, 10h05   #1
Invité régulier
 
Inscription : août 2010
Messages : 53
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 53
Points : 6
Points : 6
Par défaut aide sur un trigger

Bonjour,
Je fais mon stage et lors d'un traitement je dois utiliser un trigger mais je n'ai pas une grande idée sur les triggers alors je voudrais votre aide si c'est possible
voila j'ai une table
affect_utilisateur_poste(id_utilisateur,id_poste,date_debut_affect,date_fin_affect)

je voudrais avant l'insertion vérifier le triplet
(id_utilisateur,id_poste,date_debut_affect)
si le nouveau triplet à inséré est égale a celui qui existe on fait rien
si la date_debut_affect et inférieur a la date existante remplacer la date existante avec la nouvelle
Je sais que c'est très basique mais j'ai besoin de votre aide
comment faire merci.
skouza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 11h11   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Les triggers sont déclenchés lors d'événements sur des objets. Dans votre cas, vous voulez remplacer un ordre INSERT par votre propre code.

Il vous faut donc créer un trigger sur votre table, sur l’évènement INSERT, qui remplace l'insertion (INSTEAD OF INSERT)
:
Code SQL :
1
2
3
4
5
6
7
8
9
10
 
CREATE TRIGGER NomTrigger
ON NomTable
INSTEAD OF INSERT
AS
BEGIN
 
--votre code
 
END

Dans votre code, vous pouvez effectuer des requêtes dans la pseudo table "INSERTED" qui à la même structure que la table sur laquelle porte le trigger, et qui contient les lignes insérées.

Vous pouvez donc, en fonction du contenu de cette table et de la table cible, mettre le code qui convient, pour remplacer le fonctionnement normal d'une insertion par le fonctionnement que vous voulez.

Gardez à l'esprit que ce code doit être le plus rapide possible, mettez donc les index nécessaires pour couvrir les requêtes de votre trigger
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 11h42   #3
Invité régulier
 
Inscription : août 2010
Messages : 53
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 53
Points : 6
Points : 6
Merci pour la réponse
voila ce que j'ai fair :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ALTER TRIGGER [dbo].[AFFECTATION_POSTE_UTILISATEUR_UNICITE] ON [dbo].[AFFECTATION_POSTE_UTILISATEUR]
   Instead of INSERT
   AS SELECT * FROM annuaire
   DECLARE
    @id_utilisateur_existant integer,
	@id_poste_existant integer,
	@date_debut_affect_existante datetime
 
	BEGIN
	SELECT  id_utilisateur,id_poste,date_debut_affect FROM INSERTED i
    SELECT @id_utilisateur_existant=id_utilisateur,@id_poste_existant=id_poste,@date_debut_affect_existante=date_debut_affect
    FROM [dbo].[AFFECTATION_POSTE_UTILISATEUR]
    IF i.id_utilisateur= @id_utilisateur_existant
    INSERT INTO annuaire VALUES('yataaa')
    else INSERT INTO annuaire VALUES('yatooo')
    --update dbo.affectation_poste_utilisateur set date_debut_affect=convert(datetime,'2011-04-30 00:00:00.000',102)
    --else if
    END
mais ca marche pas en faite je veux comparé la valeur inséré avec toute les valeurs de la tables et effectuer le traitement mais j'ai l'erreur suivante :
Code :
1
2
Msg*107, Niveau*16, État*2, Procédure*AFFECTATION_POSTE_UTILISATEUR_UNICITE, Ligne*17
Le préfixe de colonne 'i' ne correspond ni au nom de TABLE ni au nom d'alias utilisés dans la requête.
skouza est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 11h56   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Vous n'avez pas besoin de toutes ces variables.

De plus, certaines de vos requetes sont inutiles.

Pensez aussi qu'il est possible en une seule requete d'inserer plusieurs lignes ! INSERTED peut donc contenir plusieurs lignes.

Vous n'avez pas détaillé tous les cas possibles (par exemple si date_debut_affect est posterieure à la date dans la table) et vous ne détaillez pas non plus ce qu'il en est pour la date de fin

Mais je pense que votre trigger peut se résumer en deux requêtes, un update et un insert, voire une seule avec un merge.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h15.


 
 
 
 
Partenaires

Hébergement Web