IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

trigger sur une vue sur sqlserver 2005


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut trigger sur une vue sur sqlserver 2005
    bonjour,

    j'ai créé la vue suivante qui contient une liste de numéro d'utilisateur, venant de la table membre_forum

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW VIEW_DECO_MB(ref_mb_forum)
    AS
    (
    	SELECT ref_mb_forum
    	FROM membre_forum
    	WHERE statut_connexion = 1
    	AND DATEDIFF(Minute, date_activite, getdate()) >= 1
    )
    la vue fonctionne très bien !

    par la suite, j'ai créé un trigger sur cette vue.
    le but étant de modifier un champ de la table membre_forum grace a la liste contenu dans la vue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TRIGGER Trigger_DECO_MB
    ON VIEW_DECO_MB
    FOR INSERT
     
    AS
    BEGIN
    UPDATE membre_forum
    SET statut_connexion = 0
    WHERE ref_mb_forum IN
    (
    	SELECT ref_mb_forum
    	FROM INSERTED
    )
    END
    seulement, le trigger ne fonctionne pas >_<

    je précise que je ne veux pas modifier les infos de la vue, mais seulement utiliser les données qu'elle contient dans le WHERE de la requète UPDATE.

    pourriez-vous me dépanner svp ??
    merci

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Utilisez directement la vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER Trigger_DECO_MB
    	ON VIEW_DECO_MB
    FOR INSERT 
    AS
    BEGIN
    	UPDATE dbo.VIEW_DECO_MB
    	SET statut_connexion = 0
    	FROM dbo.membre_forum M
    	JOIN INSERTED I ON M.ref_mb_forum = I.ref_mb_forum
    END
    Il serait cependant plus performant d'ajouter une contrainte de valeur par défaut à votre table membre_forum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ALTER TABLE dbo.membre_forum
    ADD CONSTRAINT DF_membre_forum_statut_connexion DEFAULT 0 FOR statut_connexion
    GO
    @++

  3. #3
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    Bonjour, merci beaucoup pour votre réponse, j'ai rien compris du tout mais j'ai essayé ^^

    ca ne marche malheureusement pas, l'erreur suivante apparait lors de la création du trigger :
    Msg*8197, Niveau*16, État*6, Procédure*Trigger_DECO_MB, Ligne*1
    L'objet 'VIEW_DECO_MB' n'existe pas ou n'est pas valide pour cette opération.

    autre chose

    en fait, ce script sert à deconnecter des membres qui arraient quitter leur navigateur sans appuyer sur le bouton déconnexion ( les méchants ! ^^ ).
    n'y a t'il pas moyen de changer le champs update dans la table et non dans la vue ?

    de plus comment peut-on fair un update sur la vue, et mettre un from sur membre_forum M ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE dbo.VIEW_DECO_MB
    SET statut_connexion = 0
    FROM dbo.membre_forum M
    JOIN INSERTED I ON M.ref_mb_forum = I.ref_mb_forum
    je suis sur que votre idée est bonne, mais je n'ai pas l'habitude de sqlserver, des triggers et tout ... je débarque fraichement de phpmyadmin, le mysql c'etait pour les petits

  4. #4
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    je viens de voir un article a cette adresse :
    http://msdn.microsoft.com/fr-fr/libr...1(SQL.90).aspx

    ca parle de la création de trigger sur les vues !
    j'ai tout bien fait comme c'etait marqué.
    j'ai lancé la création du trigger, et il a été créé !

    cependant, il ne fonctionne pas ! j'ai fais un select, mon statut_connexion est toujours à 1 dans ma table, et la reference de l'utilisateur est présente dans ma vue, le trigger aurait du agir !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TRIGGER Trigger_DECO_MB
    ON VIEW_DECO_MB
    INSTEAD OF INSERT
     
    AS
    BEGIN
    UPDATE membre_forum
    SET statut_connexion = 0
    WHERE ref_mb_forum =
    (
    	SELECT ref_mb_forum
    	FROM INSERTED
    )
    END
    go
    j'ai essayé le requete UPDATE en dehors du trigger, elle fonctionne très bien !
    alors j'imagine que c'est le déclenchement du trigger qui pose probleme...
    pourtant j'ai suivi les consignes à la lettre, par rapport au tutorial de MSDN !

    y-aurait'il des autorisations à donner a sqlserver pour qu'il execute un trigger sur une vue ? n'importe quoi dont je ne suis pas au courant ...

    merci de votre aide

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Déclenchez-vous bien le trigger par une commande INSERT ?

    @++

  6. #6
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    non, le trigger n'est pas déclenché par un insert, car une vue fait ses insertions toutes seules...

    mais il me semble que ça fonctionne comme ça non ? O_o
    j'espere que c'est le cas, xd

  7. #7
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    car une vue fait ses insertions toutes seules
    Attention : une vue n'est pas une table !
    Quand vous écrivez INSERT INTO maVue, c'est SQL Server qui gère l'insertion des lignes "au bon endroit".
    Une vue n'a aucune existence physique, contrairement à une table.
    C'est une représentation purement logique, que vous avez d'ailleurs défini par une requête SELECT.
    Lorsque vous faites SELECT * FROM maVue, c'est SQL Server qui exécute la requête de votre vue

    non, le trigger n'est pas déclenché par un insert
    Si, puisque vous avez écrit : INSTEAD OF INSERT

    Si vous ne faites pas d'INSERT sur votre vue, votre trigger ne s'exécute jamais

    mais il me semble que ça fonctionne comme ça non ? O_o
    Pourquoi ne pas le tester ?

    Quand vous insérez des lignes à travers la vue, comme vous faite une jointure sur les lignes que vous venez d'insérer, cela ne peut pas fonctionner : vous ajoutez des membres qui viennent de se connecter...

    @+

  8. #8
    Membre actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    696
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Décembre 2007
    Messages : 696
    Points : 222
    Points
    222
    Par défaut
    merci pour l'explication ^^
    bon alors, comment puis-je m'en sortir ?
    apparemment c'est impossible avec un trigger car il n'y pas d'INSERT...

    existe t'il un moyen de faire executer un script toutes les X minutes dans sqlserver ?
    ça à l'air un peu bète comme réponse, mais il me faut vraiment quelque chose d'automatique.
    si il y a un moyen de faire une procédure stockée qui s'exécute toutes les X minuites, ça pourrait sd'arranger je pense...

    quelqu'un a une idée ?

    merci pour votre aide !

  9. #9
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    apparemment c'est impossible avec un trigger car il n'y pas d'INSERT
    Vous pouvez aussi écrire un trigger INSTEAD OF UPDATE ...
    Mais sachez que les triggers sont gourmands en ressource, donc si la table à laquelle vous allez attacher le trigger est souvent mise à jour, vous allez perdre un peu de performances ...

    si il y a un moyen de faire une procédure stockée qui s'exécute toutes les X minuites, ça pourrait sd'arranger je pense...
    Bien sûr, avec l'agent SQL Server.
    Vous pouvez créer un job qui exécute une tâche toutes les minutes par exemple

    Je vous invite à regarder la documentation à ce sujet, notamment les rubriques :

    - "Procédure : créer une étape de travail Transact-SQL (SQL Server Management Studio)"
    - "Procédure : planifier un travail (SQL Server Management Studio)"

    @++

Discussions similaires

  1. jointure externe FULL sur une même table [SQLServer 2005]
    Par belrifou dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/03/2010, 15h14
  2. [MySQL] Mise à jour avec une condition sur une vue
    Par thor76160 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 02/03/2009, 01h00
  3. [Trigger] Comment le réaliser sur une vue ?
    Par mandale dans le forum DB2
    Réponses: 1
    Dernier message: 19/09/2005, 13h43
  4. Comment avoir une référence sur une Vue
    Par Philippe299 dans le forum MFC
    Réponses: 1
    Dernier message: 12/08/2005, 10h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo