[DUDA]PL/SQL en v$session

Iniciado por -Ramc-, 5 Noviembre 2009, 19:12 PM

0 Miembros y 1 Visitante están viendo este tema.

-Ramc-

Hola, pasó a estrenar el nuevo subforo con esta duda.

Tengo que hacer un procedimento almacenado que me diga los comandos ejecutados por X usuario en X intervalo fechas que recibo por parametros; se que al ejecutar un comando con un usuario en la vista v$session, específicamente el parametro command se modifica con el código del último comando de ese usuario, pero, no hay manera de poner un trigger en esa vista, ya que me tocó hacer un enredo para obtener los usuarios conectados y guardarlos en una tabla.  :xD

Pero, no tengo idea de como hacer para guardar todas esas modificaciones que se hagan en v$session a mi tabla, lo que tenía pensado si no había otra forma era poner un bucle que fuera consultando v$session y al ver que algo se a modificado, lo guardara junto con la fecha actual, pero, este método, ademas de no ser eficiente, mantendría mi script dentro de un bucle infinito y tendría que abrir otra sesión, para ejecutar otros comandos.

Necesito su ayuda, si alguien sabe de algún otro método para conseguir esa información, que no sea el bucle mortal  :xD por favor hagamelo saber en este post, estaría muy agradecido, no que me den el código, ya que como ven puedo sacarlo con el bucle mortal jaja, pero, si necesito un empujon para saber si hay una forma más eficiente, apenas voy aprendiendo a manejar oracle, supongo que para ustedes será fácil, pero, la documentación tampoco es muy buena en internet.

Gracias y saludos.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

^Tifa^

La tienes un pelin dificil  ;D  lo mas cercano que se me podria ocurrir (Ya que no puedes usar triggers y la verdad un bucle  :-\  no quisiera saber cuanto afectaria esto a la lectura de disco). Puedes intentar con un Evento? un Evento que se ejecute cada 60 segundos (1 minuto) y consulte la vista V$SESSION para obtener eso que solicitas... Ya con dicho evento podrias llamar tu procedimiento almacenado acorde a que se cumpla o no algo, lo negativo de los eventos que no es en tiempo real (Como un trigger) pero mejor que lea cada 60 segundos y no que lea cada segundo como haria un Bucle. Si te interesa sobre eventos en Oracle investigate sobre:

DBMS_SCHEDULER

;) 

Novlucker

De que BBDD estamos hablando?

Las consultas las crean los propios usuarios?, porque si lo tienes encapsulado podrías tener procedimientos que hagan lo que sea, y en el proceso llaman a otro que realice el LOG :-\

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

-Ramc-

Muchas gracias ^TiFa^ , voy a probar con un evento y a investigar porque no me los explicaron en clases  :¬¬.

Porque estoy haciendo todo como sys para poder sacar la información y ni siquiera así me deja ponerle un trigger a esa vista, me dice que no es posible a ese tipo de vistas y blablabla.  :xD

Voy a probar y te comento.

Saludos.

The following error or errors occurred while posting this message:
Warning - while you were typing a new reply has been posted. You may wish to review your post.


Uso oracle.

Es que tengo que registrar todo, tanto comandos DML como DDL, de cualquier usuario.

Hay una vista v$session que me deja ver los usuarios, también tiene un campo llamado command que guarda un número que equivale a un comando, por ejemplo el 1 es CREATE TABLE y el 3 es SELECT y así, pero, a esa vista no le puedo poner un trigger.

Entonces tenía pensando un procedimiento que tomara los datos de la vista y los manipulara con un cursor para saber cualos son los que son :xD y los guardara en mi tabla junto con la fecha actual.

Después otro procedimiento recibiera 2 fechas(X, Y), que tomara los datos de esa tabla y me mostrara los datos que están entre las fechas X y Y.

No puedo dejar a ese procedimiento recopilando información sólo ya que necesito poder ejecutar otros comandos.

Saludos.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

^Tifa^

#4
Ahhhhhhhh pero yo pensaba que era que en tu clase los profesores te habian exhigido que no podias crear un TRIGGER sobre esta vista   :xD  por eso sugeri lo del evento, olvidalo.

Prueba lo siguiente:

Código (sql) [Seleccionar]


CREATE OR REPLACE TRIGGER trigo
 AFTER LOGON ON DATABASE
DECLARE
 v_prog sys.v_$session.program%TYPE;
BEGIN
  /* Tu codigo Aqui */
END;
/



:) No me digas tampoco te explicaron sobre los TRIGGERS de sistemas y sus condiciones en Oracle???? (No estoy ya empapada del tema, hace unos meses abandone el PL/SQL en Oracle) Pero esto te puede ayudar, para crear TRIGGERS sobre vistas de SYSTEM.

http://www.psoug.org/reference/system_trigger.html

Tambien existe la posibilidad de que hagas otra vista de la vista v$session solamente con los campos que te interesan ver de v$session y crear un usuario con los roles que le permitan ver dicha vista en su entorno, y asi captar en tiempo real todos los cambios que requieras obtener.  :P Y puedes crear tu Stored Procedure llamando los datos de esta vista nueva que usa de referencia a v$session y mostrar en OUTPUT los resultados obtenidos  ;)  ya sabes que a tu ST puedes concatenarle la fecha actual con current_date();

Suerte con eso :)

-Ramc-

Sí, eso fue lo que hice para obtener los usuarios conectados, pero, no hay una que diga AFTER COMMAND EXECUTE ON DATABASE o sí??  :huh:

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

^Tifa^

No puedo afirmartelo lo siento.

Pero porque no creas una vista copia de v$session solo con los campos que deseas obtener ver? y dicha vista otorgale permisos a X usuario para que este usuario cree un procedimiento almacenado (si es requerido) para ver dichos datos llamando los campos de esa vista nueva?

^Tifa^

De hecho hice una mini-prueba en mi Oracle   :-*

Código (sql) [Seleccionar]


SQL> create view ejemplo as select command, user#, username, status, logon_time from v$session;

View created.

SQL> select * from ejemplo;

  COMMAND      USER# USERNAME                       STATUS   LOGON_TIM
---------- ---------- ------------------------------ -------- ---------
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        3          0 SYS                            ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09

  COMMAND      USER# USERNAME                       STATUS   LOGON_TIM
---------- ---------- ------------------------------ -------- ---------
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09

18 rows selected.

SQL> create user pepe identified by pepe;

User created.

SQL> grant connect, resource to pepe;

Grant succeeded.

SQL> grant select, insert, update on SYS.EJEMPLO to pepe;

Grant succeeded.

SQL> exit

oracle@marian:~$ sqlplus pepe/pepe                                                    

SQL*Plus: Release 10.2.0.1.0 - Production on Thu Nov 5 15:39:45 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.


Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options                  

SQL> select * from SYS.EJEMPLO;

  COMMAND      USER# USERNAME                       STATUS   LOGON_TIM
---------- ---------- ------------------------------ -------- ---------
        0          0                                ACTIVE   05-NOV-09
        3         60 PEPE                           ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        3          0 SYS                            ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09

  COMMAND      USER# USERNAME                       STATUS   LOGON_TIM
---------- ---------- ------------------------------ -------- ---------
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09
        0          0                                ACTIVE   05-NOV-09

19 rows selected.





Te podria servir... nunca se sabe  :P

-Ramc-

#8
Cita de: ^TiFa^ en  5 Noviembre 2009, 20:16 PM
No puedo afirmartelo lo siento.

Pero porque no creas una vista copia de v$session solo con los campos que deseas obtener ver? y dicha vista otorgale permisos a X usuario para que este usuario cree un procedimiento almacenado (si es requerido) para ver dichos datos llamando los campos de esa vista nueva?
Pero, si creo una vista copia, es lo mismo que con la vista original, no puedo crearle trigger, así que tendría que sacarle los datos, guardarlos en mi tabla y consultarlos como haría con v$session la original.

O sea, necesito sacar el campo command cada vez que se modifique y guardarlo en otra tabla con la fecha actual y el usuario que lo hizo, pero, no puedo ponerle el trigger a v$session, ni a la vista creada de el.  :-\

EDIT: El error al intentar poner el trigger es:
Citar
Error report:
ORA-02030: can only select from fixed tables/views
02030. 00000 -  "can only select from fixed tables/views"
*Cause:    An attempt is being made to perform an operation other than
           a retrieval from a fixed table/view.
*Action:   You may only select rows from fixed tables/views.

Shhh... be vewy, vewy, quiet!  I'm hunting wabbits...
LA PANDILLA MAS GRANDE DE MI CIUDAD, SE LLAMA POLICIA NACIONAL.

^Tifa^

#9
Hasta lo poco que me concierne, no es posible crear triggers en vistas  del esquema SYS  ;) sugeri la creacion de una copia a v$session por si ibas a trabajar sobre otro usuario y no SYSTEM. Tambien recuerda que las vistas reflejan todo en tiempo real, no es una tabla estatica que no se actualiza al menos que intervenga manos humanas.

Podrias crear tu evento con DBMS_SCHEDULER que se reproduzca cada 60 segundos (1 minuto) y llame los datos en ese tiempo y te vaya haciendo un log spool en un archivo fisico, o en una tabla o donde gustes de todo lo que ocurra cada 60 segundos sobre los campos que te interesan de v$session. (Pero esto no seria en tiempo real) sino cada 60 segundos.