elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  Bases de Datos (Moderador: Carloswaldo)
| | | |-+  [DUDA]PL/SQL en v$session
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA]PL/SQL en v$session  (Leído 11,798 veces)
^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: [DUDA]PL/SQL en v$session
« Respuesta #10 en: 6 Noviembre 2009, 04:52 am »

Cielo.

Citar
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.

V$SESSION es un Sinonimo de V_$SESSION  ;) te he estado buscando otras vueltas al asunto porque como te he venido diciendo y como te dcontinuare diciendo (NO ES POSIBLE CREAR TRIGGERS EN OBJETOS PERTENECIENTES A SYS) Por ende estas tratando de hacer algo que literalmente es imposible.

La unica solucion que veo a lo que quieres hacer... y no te lo recomendaria para nada creeme. Es movilizar V_$SESSION fuera del esquema de SYS (Pero esto es hackear el funcionamiento del motor como tal, y no puedo prevenirte de que problemas puede esto presentarte... y olvidate del soporte). Por lo tanto no puedo guiarte en este proceso, sobretodo porque tendria que buscar la TABLA principal a la cual hace referencia la vista sección, dicha tabla puede ser 1 como puede ser varios Joines de varias tablas, para que entonces mudes esto a otro esquema que no sea SYS para poder crear tu TRIGGER y que sea soportable por el motor.

Obviando lo anterior,  por lo peligroso que resulta. Podrias realizar lo siguiente tambien (como opcion)
 
1) Crea 1 tabla de uso general (con permisos INSERT) que tenga los campos requeridos he importantes por ti (usuario, fecha, comando) esos campos se iran llenando en base a una solicitud que haras a la vista V$SESSION.

2) Crea 1 TRIGGER con tipo AFTER LOGON que tome datos del usuario al este iniciar sección y los mande a dicha tabla.

3)  Crea 1 TRIGGER anidado (after insert, after delete, after update, etc) por cada tabla de usuario donde al realizar una consulta SQL a una tabla esta solicite el campo correspondiente a la vista SESSION y rellene o actualize la tabla donde se van guardando todas las acciones.

Por ejemplo, imaginate que tengo un TRIGGER :

create trigger fulanito, before insert on tablita or after update on tablita for each row begin, if update select COMMAND into variable from v$session; elsif insert select COMMAND into variable1 from v$session;

Se que la sintaxis anterior esta erronea... la hice para ejemplificarte, bien tenemos 1 variable que capta el valor correspondiente a la consulta ejercida en dicha tabla digamos que si el usuario realizo un INSERT en la tabla, la variable que solicita y guarda el registro del campo COMMAND de V$session digamos que el valor es 2, bueno tu TRIGGER tiene que verificar despues de realizar todas esas comparaciones cual accion finalmente se realizo en la tabla, ejemplo:

if ( variable == 2 ); then
update tabla set comando = variable where user = show_user();
elsif (variable == 3) then
update tabla set comando = variable where user = show_user();

Espero que sea mas o menos entendible la idea.

Es una tarea mas pesada, pero menos riesgosa que movilizar objetos de SYS a un esquema individual (Aunque este paso sea mas corto) No es algo seguro.

PD: Se que no me explico muy bien, si tienes alguna duda o si te surge alguna idea compartela :)


« Última modificación: 6 Noviembre 2009, 06:08 am por ^TiFa^ » En línea

^Tifa^


Desconectado Desconectado

Mensajes: 2.804


Ver Perfil
Re: [DUDA]PL/SQL en v$session
« Respuesta #11 en: 6 Noviembre 2009, 15:34 pm »

Hola -Ramc-

Bueno, por tu requerimiento he retornado a mi practica con PL/SQL en Oracle (Que jure que jamas volveria a tirar 1 codigo en PL de Oracle) pero bueno  :rolleyes: deseo intentar ayudarte y darte ideas para que llegues a tu objetivo.

Quedamos en que efectivamente dentro del esquema SYS no puedes crear TRIGGERS ni a vistas ni a tablas, movilizar tablas o vistas de la metadata de SYS a otro esquema... no es recomendable (Aunque funcione, esto no es lo ideal). Asi que te sugeri crear en cada esquema de usuario 1 TRIGGER que solicite esos datos que te interesan en V$SESSION y los guarde en una tabla comun. (Es mas trabajoso, sobretodo si tienes miles de tablas, pero esto te dara una idea).

Mira el escenario que he realizado con el usuario PEPE, otorgue permisos de SELECT a V_$SESSION para PEPE asi con su TRIGGER puedo solicitar info de este usuario y irla guardando en una tabla, por ejemplo.

Código
  1.  
  2. SET serveroutput ON
  3. DECLARE
  4. numero NUMBER;
  5. usuario CHAR(20);
  6. BEGIN
  7. SELECT username INTO usuario FROM v$session WHERE username IS NOT NULL;
  8. SELECT command INTO numero FROM v$session WHERE USER = usuario AND command != 0;
  9. dbms_output.put_line(numero||' '||usuario);
  10. END;
  11. /
  12.  
  13.  

Si haces lo anterior veras que obtuve en tiempo real el valor de COMMAND y USUARIO que ejecuta la accion. Ahora chequea esto:

Código
  1.  
  2. SQL> DESCRIBE ejemplo;
  3. Name                                      NULL?    TYPE
  4. ----------------------------------------- -------- ----------------------------
  5. NUMERO                                             NUMBER(38)
  6. USUARIO                                            CHAR(20)
  7.  
  8. CREATE OR REPLACE TRIGGER TRIGO
  9. BEFORE INSERT OR DELETE OR UPDATE ON EJEMPLO
  10. FOR EACH ROW
  11. DECLARE
  12. numero NUMBER;
  13. palabra CHAR(20);
  14. BEGIN
  15.  
  16. IF INSERTING THEN
  17.  SELECT USERNAME INTO palabra FROM v$session WHERE USERNAME IS NOT NULL;
  18.  SELECT COMMAND INTO numero FROM v$session WHERE USER = palabra AND COMMAND != 0;
  19.  :NEW.NUMERO := numero;
  20.  :NEW.USUARIO := palabra;
  21. ELSIF UPDATING THEN
  22.  SELECT USERNAME INTO palabra FROM v$session WHERE USERNAME IS NOT NULL;
  23.  SELECT COMMAND INTO numero FROM v$session WHERE USER = palabra AND COMMAND != 0;
  24.  :NEW.NUMERO := numero;
  25.  :NEW.USUARIO := palabra;
  26. ELSE
  27.  :NEW.NUMERO := 0;
  28.  :NEW.USUARIO := NULL;
  29.  DELETE FROM ejemplo WHERE NUMERO = 0 AND USUARIO IS NULL;
  30.  COMMIT;
  31. END IF;
  32.  
  33. END TRIGO;
  34. /
  35.  
  36. SQL> SELECT * FROM ejemplo;
  37.  
  38. no ROWS selected
  39.  
  40. SQL> INSERT INTO ejemplo VALUES(1,'Mercado');
  41.  
  42. 1 ROW created.
  43.  
  44. SQL> SELECT * FROM ejemplo;
  45.  
  46.    NUMERO USUARIO
  47. ---------- --------------------
  48.         3 PEPE
  49.  
  50. SQL> INSERT INTO ejemplo VALUES(2,'Marta');
  51.  
  52. 1 ROW created.
  53.  
  54. SQL> SELECT * FROM ejemplo;
  55.  
  56.    NUMERO USUARIO
  57. ---------- --------------------
  58.         3 PEPE
  59.         3 PEPE
  60.  
  61.  

Utilize como te dije 1 TRIGGER anidado por cada tabla, y asi se guarda la accion y el usuario en una tercera tabla  ;)  para la fecha actual del comando ejecutado llama al campo LOGON_TIME de V$SESSION dentro del TRIGGER.

Ojala te pueda servir de guia para expandir lo que andas solicitando y puedas llegar a un objetivo final  :P


« Última modificación: 6 Noviembre 2009, 15:39 pm por ^TiFa^ » En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA]Como inicio session segura en el foro?
Sugerencias y dudas sobre el Foro
wACtOr 6 4,145 Último mensaje 1 Diciembre 2010, 02:42 am
por Carloswaldo
ayuda session php
PHP
kakashi20 3 3,853 Último mensaje 2 Febrero 2011, 02:25 am
por kakashi20
php session
PHP
ime 2 2,280 Último mensaje 18 Junio 2013, 15:53 pm
por ime
Seguridad en $session
PHP
basickdagger 3 2,142 Último mensaje 10 Mayo 2014, 20:06 pm
por engel lex
ataques weak session ids « 1 2 »
Nivel Web
tecasoft 10 7,187 Último mensaje 1 Diciembre 2017, 15:20 pm
por engel lex
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines