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