# ¿Qué versiones de clientes Oracle se conectan a mi base?

Para poder saber esto sin perdernos de ninguna conexión, ni siquiera esas conexiones que se realizan una vez por mes y por la noche, crearemos un trigger de logon que relevará la información del cliente y la guardará en una tabla para este fin.

Comencemos creando una tabla en el esquema SYS. Yo en este ejemplo la creé en el tablespace SYSAUX, pero vos podés crearla en el tablespace que mejor te parezca:

```sql
CREATE TABLE sys.audit_sesiones_cliente (
    id               NUMBER GENERATED ALWAYS AS IDENTITY,
    evento           VARCHAR2(10),   -- LOGON | LOGOFF
    fecha_evento     DATE,
    sid              NUMBER,
    serial#          NUMBER,
    inst_id          NUMBER,
    username         VARCHAR2(30),
    osuser           VARCHAR2(30),
    machine          VARCHAR2(64),
    program          VARCHAR2(128),
    client_version   VARCHAR2(20)
) TABLESPACE SYSAUX;
```

Y ahora creamos el trigger de logon, que contemplará todas las conexiones que se realicen en todos los nodos del RAC:

```sql
CREATE TRIGGER SYS.trg_logon_cliente
AFTER LOGON ON DATABASE
BEGIN
    INSERT INTO SYS.audit_sesiones_cliente (
        evento, fecha_evento,
        sid, serial#, inst_id,
        username, osuser, machine, program,
        client_version
    )
    SELECT 'LOGON', SYSDATE,
           s.sid, s.serial#, s.inst_id,
           s.username, s.osuser, s.machine, s.program,
           c.client_version
    FROM gv$session s
    JOIN gv$session_connect_info c
      ON s.inst_id = c.inst_id
     AND s.sid     = c.sid
   WHERE s.audsid = SYS_CONTEXT('USERENV','SESSIONID');
END;
/
```

Listo, ahora a esperar que pase al menos un mes, para no perdernos ninguna conexión de esos procesos batches que se ejecutan una vez por mes. Si en tu entorno tenés procesos que se ejecutan semestralmente, deberás esperar 6 meses para asegurarte de no perder nada.

¡Esto es todo!

Hasta el próximo post 😀

Saludos desde Buenos Aires, Argentina
