[TRIGGER]Message d'erreur insoluble

salut la zone !
voila mon probleme, j’essaye de creer un trigger pour une base données oracle 10g dont le code est le suivant:

[sql]Create or replace trigger Connection_base
after logon on database
begin select object_name, object_type, created, status from user_objects; if :user_objects.status='invalid’
then raise_application_error (-2501,‘Un objet a un status invalid veuillez verifier de quel objet il sagit et reparrez le’);
end if;
end;
/[/sql]

A la création du trigger j’ai le message d’erreur suivant : ORA-03113: fin de fichier sur canal de communication.

Aprés quelques recherches sur google je n’ai rien trouvé de concluant.
Auriez vous une idée sur la résolution du probléme.

Ah les géniaux messages d’erreur de Oracle… Mon conseil, essaie d’enlever du code ou de le modifier jusqu’à trouver ce qui pose problème, ça t’aidera peut-être.

Premier lien google “Un message de type “fin de fichier sur canal de communication” peut correspondre à un problème réseau”, je sais pas si ça peut te servir.

astrojojo : ORA-03113 c’est souvent une erreur résultant d’une autre erreur. Un peu comme erreur de générale de protection en écriture.

Arthal: Je connais plutôt bien Oracle mais j’ai fait peu de trigger. Je ne m’explique pas pourquoi il y a deux points ( : ) devant user_objects.status. Ce n’est pourtant pas une variable comme OLD ou NEW ?

Et tu veux faire quoi exactement ? Vérifier qu’il n’existe pas d’objet invalide ? Le if après est très bizzare.

Moi j’aurais fait cela:

Create or replace trigger Connection_base after logon on database nb_invalides number=0; begin select count(*) into nb_invalides from user_objects where user_objects.status='invalid'; if nb_invalides >0 then raise_application_error (-2501,'Un objet a un status invalid veuillez verifier de quel objet il sagit et reparrez le'); end if; end; /

[quote=“phili_b, post:4, topic: 46457”]Arthal: Je connais plutôt bien Oracle mais j’ai fait peu de trigger. Je ne m’explique pas pourquoi il y a deux points ( : ) devant user_objects.status. Ce n’est pourtant pas une variable comme OLD ou NEW ?

Et tu veux faire quoi exactement ? Vérifier qu’il n’existe pas d’objet invalide ? Le if après est très bizzare.[/quote]

Les deux point c’est une erreur de copier collé.
le but de ce trigger c’est de permettre a un utilisateur de voir tous les objets qui lui appartiennent. Ainsi l’util. se connect voit ses table, ses sequences etc …
Ce trigger a egalement pour but de verifier le statut de ces objets. Si ils ont le statut “invalid” un message d’erreur doit en avaertir l’utilisateur.

Merci pour voas reponse, je vais essaez la solution de ‘phili_b’.

EDIT : Alors voila j’ai un peu avancé, je me suis connecté a la base en tant que sysdba avec mon utilisateur
[sql]sqlplus cinema/mdp as sysdba[/sql]

j’ai ensuite modifié mon code en mettant ceci:

[sql]create or replace trigger verif_connection
after logon on database
begin select into object_name, object_type, created, status from user_objects; if user_objects.status like '%invalid%'
then raise_application_error (-20501,‘Un objet a un status invalid veuillez verifier de quel objet il sagit et reparrez le’);
end if;
end;
/[/sql]

Il me dit que le trigger a été créé avec des erreurs de compilation.
Je fais donc un “show error” qui me donne ceci.

[sql]PL/SQL:Statement ignored
PL/SQL: ORA-00936: expression absente[/sql]

Je n’ai pas encore fait de recherche sur le net mais si vous avez des idées je suis preneur.

As-tu essayé la solution de phili_b ? Elle devrait parfaitement marcher (si invalid est minuscule).

Sinon, dans ton code, j’ai un problème avec ton if comme phili_b et aussi ton “select into” pour lequel je dirai qu’effectivement, une expression est absente (toujours revenir à la grammaire en cas de doutes).

Par contre, enlève les fautes en français ou passe totalement en anglais please. ^^

Arthal, ta requête telle qu’elle est écrite n’a pas de sens pour plusieurs raisons:[ul]
[li]Dans un select into il faut autant de variable après le into que de colonnes sélectionnées avant le into (A moins d’avoir une variable record ou rowtype en destination)[/li][li]D’autre part ta requête peut ramener plusieurs lignes. Comment pourrais-tu gérer cela avec le if tel que cela est écrit sans curseur. Et comment veux tu que le select into fonctionne puisque le into n’est fait que pour les résultats ne ramenant qu’une ligne.[/li][li]Ensuite dans le if, d’où vient le contenu de user_objects.status ? Le contenu d’une table ne peut être lu de cette façon et un like dans un if écrit comme cela ne peut pas fonctionner[/li][li]Le select dans une procédure oracle ne peut pas fonctionner comme le select d’une procédure SQL Server: Sous Oracle dans une procédure tu ne peux pas faire un simple select qui ramène en sortie console une liste de lignes[/li][/ul]

Si tu veux vraiment retourner une liste de ligne en sortie console il faut procéder autrement sous Oracle[ul]
[li]ou bien une boucle, un curseur, et dbms_output [/li][li]ou bien d’utiliser en sortie un curseur référencé avec sa déclaration par ailleurs, mais ça ne renverrait les lignes que dans ce curseur référencé que tu ne pourrais afficher. Tu reviendrais au cas précédent.[/li][/ul]

:slight_smile:

edit: ortho