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

Oracle Discussion :

[Pl/Sql]trigger et vue


Sujet :

Oracle

  1. #1
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut [Pl/Sql]trigger et vue
    Salut,

    J'aurais aimé savoir s'il était possible de créer un trigger permettant l'affichage d'une vue lors de l'appel d'une table.

    Dans les cours je n'arrive pas à trouver qch me le confirmant. Et n'y arrivant pas j'aimerais pas essayer trop longtemps pour rien.

    Je suis sous oracle 8i et j'utilise DbVizualiser pour modifier ma base.

    Merci de votre aide

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Qu'entendez-vous par "afficher une vue" ?

  3. #3
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    En fait j'ai changer une table en deux tables liées par une contrainte de clé étrangère.
    J'ai créer un vue modélisant l'ancienne table:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create view v_test2 as select T.nom, T.prenom, T.id, C.adresse from test2 T, test1 C
            where T.test1_id=C.id  ;
    E t j'aimerais que lorsqu'on veut afficher une de mes nouvelles tables, la table d'origine soit affichée (en appelant la vue).

    J'ai pensé que créer une vue puis utiliser un trigger était la solution mais ce n'est peut-être pas le cas?

  4. #4
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    Excusez moi d'insister, mais je n'arrive vraiment pas à résoudre mon problème

  5. #5
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Oui, mais je ne comprends pas votre problème.

    E t j'aimerais que lorsqu'on veut afficher une de mes nouvelles tables, la table d'origine soit affichée (en appelant la vue).
    c'est quoi les nouvelles tables ?

  6. #6
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Si je comprends bien, quand on fait un SELECT FROM TOTO, vous voulez qu'Oracle réponde par un SELECT FROM TITI ?

  7. #7
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Il n'existe pas de trigger sur un select (enfin pas à ma connaissance!)

    Je serais toi, je renomerais la table, puis je créerais une vue avec l'ancien nom de la table en prenant bien garde de faire exactement correspondre les colonnes (type et ordre de création)

  8. #8
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    Désolé de ne pas être trés clair.

    Oui en gros j'aimerais que lors d'un select toto oracle réponde par un select toto et un select titi.
    Mon maître de stage (absent donc peut pas m'aider) m'a demander de changer l'ensemble des tables de la base, mais lorsque l'on va faire un select sur la nouvelle table il veut que l'ancienne apparaisse également.

  9. #9
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    si comme le dit remi4444 :

    [citation]Il n'existe pas de trigger sur un select (enfin pas à ma connaissance!)[/citation]

    ça ne me semble pas réalisable.

  10. #10
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    Tout dépend de la manière dont tu veux voir apparaitre tes 2 tables, tu peux toujours faire une vue qui fait un "UNION ALL" des 2 anciennes table et jouer sur les noms comme je te l'ais indiqué. Si tu veux qu'il y ai 2 affichages séparés alors ce n'est pas possible parceque sous oracle la partie affichage est bien séparée de la partie données.

    Si tu as un applicatif qui accède à ta base de données, c'est à ce niveau là qu'il faudra agir mais pas sur le select qui est un trop bas niveau.

    De toutes façon pour une programmation propre, il ne faut pas mélanger les choses et essayer de garder les 3 parties DONNEES-TRAITEMENT-AFFICHAGE (mais bon ça me regarde pas aprés tout... )

  11. #11
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    Bon, je vais essayer de voir avec ce que tu m'a dit. Mais je suis pas sûr que c'est ce que veut mon maître de stage.

    Au pire on verra ça à son retour.

    Sinon peut-être pouvez vous m'aider sur un autre problème.

    J'ai les tables suivantes:

    test1
    id
    adresse

    et

    test2
    id
    nom
    prenom
    test1_id (foreign key references test1)

    J'ai créé la vue donnée dans mes précédents messages.
    Je cré le trigger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER tr_test2 AFTER insert ON test2 
    begin
    select * from v_test2
    end;
    le trigger est créé mais lorsque j'essaye d'insérer une ligne dans la table test2 j'ai l'erreur:
    déclencheur non valide, échec de revalidation

    Si vous voyez d'où ça peut provenir...

    Merci à tous

  12. #12
    Membre Expert
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Par défaut
    C'est typiquement ce qu'on ne peut pas faire avec oracle! je pense que ton maitre de stage confond avec sql-serveur ou sybase.

    Dans sql-serveur on peut faire un ou plusieur select dans les procédures stockées. Leurs appel ouvre autant de flux de sortie qu'il y a de requêtes.

    Dans oracle on ne peut pas car une procédure stockée et encore moins un trigger n'est lié à la sortie standart. Il n'y a pas de mélange entre l'affichage et le traitement.

    PL/SQL = Traitement.
    SQLPLUS = interface utilisateur.

    Un trigger est forcément dans le domaine du traitement pur donc en PL/SQL, voila pourquoi tu ne peut pas faire de select direct à l'intérieur. Tu dois obligatoirement avoir des variables (record, curseurs ou variables simples) dans lesquelles tu va stocker le résultat....

  13. #13
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Par défaut nom
    bonjour mon cher,
    comme t'as déjà expliqué remi4444 il est impossible de faire des selects simples dans les procedures stockées sous oracle ce que tu peux faire c'est d'utiliser la la méthode suivante:
    tu déclare un type table :
    TYPE ton_type IS TABLE OF your_table%ROWTYPE INDEX BY PLS_INTEGER;

    tu déclare un tableau sql de ton type :
    ton_tableau ton_type;

    tu peux alors utiliser la syntaxe :
    SELECT * BULK COLLECT INTO ton_tableau FROM your_table;

    tu peux alors affichier le résultat de ton select comme suite :
    for i in ton_tableau.first..ton_tableau.last
    loop
    dbms_output.put_line(ton_tableau.col1||ton_tableau.col2||...);
    end loop;

    ________________________________________________________________
    concernant ton premier problème si j'ai bien compris : il y avait une table T1
    tu as pris une partie des colonnes de T1 que tu as mis dans une table T2
    tu as créé une vue V1 qui regroupe toutes les colonnes.

    tu veux alors si un utilisateur fait un select * from T1 le systeme fait appel à un select * from V1.
    si c'est ton problème il suffit de jouer sur les noms comme t'a expliqué remi4444 ou bien :

    tu peux creer un synonym ,pour ta vue, ayant le même nom de ta table T1 :
    create public synonym T1 for V1

    tu joues alors sur le privileges :
    revoke select on utilisateur_createur.T1 from user;
    grant select on public.T1 to user;


    user ne peut plus faire appel à select * from utilisateur.T1
    mais il peut faire select * from T1 alors c'est la vue qui est invoquée.

    j'espère que ca marchera.
    bon courage.

  14. #14
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Par défaut
    désolé,
    pour l'affichage c'est dbms_output.put_line(ton_tableau(i).col1||ton_tableau(i).col2||...);
    j'ai oublié de spécifié le Ieme élément.

  15. #15
    Membre confirmé
    Inscrit en
    Février 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 33
    Par défaut
    ok

  16. #16
    Membre confirmé
    Étudiant
    Inscrit en
    Juillet 2006
    Messages
    61
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2006
    Messages : 61
    Par défaut
    Merci à tous les deux,
    Je vais essayer vos suggestions mais c'est pas gagné (je suis un débutant qui a beaucoup de mal )

    En tout cas j'ai au moins compris où est le problème.

Discussions similaires

  1. [Pl/Sql] Trigger INSTEAD OF et vue
    Par sdesousa dans le forum Oracle
    Réponses: 3
    Dernier message: 04/08/2006, 14h16
  2. [Sql] index sur vue
    Par fxp17 dans le forum Oracle
    Réponses: 8
    Dernier message: 23/02/2006, 10h56
  3. [PL/SQL] Trigger qui appelle une procédure
    Par alex6891 dans le forum Oracle
    Réponses: 5
    Dernier message: 19/01/2006, 09h01
  4. [requète sql] Créer une vue ordonnée
    Par gangsoleil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/01/2006, 18h34
  5. Pb Trigger sur vue
    Par cosminutza dans le forum Développement
    Réponses: 3
    Dernier message: 28/07/2003, 16h37

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