Category: Sql*Plus

Oracle 12c New Features : Último login en SqlPlus



Una de las nuevas características de Oracle está dado por una sutileza en seguridad..

De ahora en adelante cada vez que nos conectemos a Sql*Plus nos dará la última conexión válida , lo cual puede tener algo de significancia para algunas personas... |-|



Está información es almacenada en la tabla SYS.USER$ , la pueden consultar con el siguiente SQL

select name ,
to_char(spare6,'dd-mm-yyyy hh24:mi:ss')
from sys.user$
where name like '&1';


Algunas obervaciones :

- Deben tener cuidado en sacar la diferencia horaria de la hora que muestra la tabla SYS.USER$ , nosotros en Santiago de Chile somos UTC -04:00 , por eso la fecha del campo spare6 muestra 4 horas más.

- Para el usuario SYS , no se muestra la última conexión :|

- Solamente muestra las últimas conexiones a SQL*Plus, si me conecto a RMAN con el mismo usuario, esto no queda registrado como última conexión....malo malo |-|

Espero les sirva

by Ligarius
16.07.13. 22:28:38. 164 words, 3888 views. Categories: Oracle 12c, Sql*Plus ,

Borrando registros con funciones analíticas



Hola..

Este código tiene varios años y lo encontré en un foro en el cual yo era participe (y creador) se llama o llamaba , desarrolloOracle y era de Yahoo Groups

El código es sencillo y sirve para borrar registros repetidos desde una tabla, dejando sólo uno de ellos

He acá el código

:oops: Código modificado pues me faltaron unos campos
delete  where rowid in (
select fila
 from (
select  rowid fila ,  
         , 
        row_number() 
        over (partition by -campos repetidos- 
              order by -campos repetidos- ) cantidad
  from 
      )
where cantidad > 1
   )



by Ligarius
02.02.12. 09:03:18. 91 words, 4299 views. Categories: Sql*Plus ,

Las famosas comillas, para escribir una comilla ….. ahorratelas!!



Quien alguna vez no lucho con las comillas dentro de Sql Dinámicos para poder mostrar una comilla

Algo complicado, engorroso y dificultoso.



Claro, era el típico caso de que dentro de una instrucción debiamos colocar como trescientas comillas para que apareciera una , que entretenido!!!

Por ejemplo si queríamos una consulta dinámica , que nos desplegará un where con una literal , debiamos escribir algo así

Ejemplo :

var_sql := 'update '|| var_tabla ||' set campo1 = '||'valor literal';

Oviamente la sentencia anterior nos arrojaría error , pues en la transformación de la sentencia el CBO la asumiría como

Siendo var_tabla = TAB_PAGOS y 'valor literal' = ADF4561;

SQL> r
1 declare
2 var_sql varchar2(1000);
3 var_tabla varchar2(1000) := 'TABLA1';
4 begin
5 var_sql := 'update '||var_tabla||' set campo1 = '||'ADFR5141';
6 dbms_output.put_line(var_sql);
7* end;

update TABLA1 set campo1 = ADFR5141 –> Está sentenciada error si es ejecutada

PL/SQL procedure successfully completed.

SQL>

Por ende hay un error y se debiesen generar las comillas para su visualización

var_sql := 'update '|| var_tabla ||' set campo1 = '||''||'valor literal'||'';

SQL> r
1 declare
2 var_sql varchar2(1000);
3 var_tabla varchar2(1000) := 'TABLA1';
4 begin
5 var_sql := 'update '||var_tabla||' set campo1 = '||''||'ADFR5141'||''';
6 dbms_output.put_line(var_sql);
7* end;

update TABLA1 set campo1 = 'ADFR5141'; –> Funcionaría sin inconvenientes

Por lo que se ve es demasiado engorroso, ahora imaginanse coloca un formato de fecha dentro de ese enredo , con un to_char , ¿se enredaría mas cierto?

Pues bien, esto se soluciona en gran medida en Oracle10g, con una utilidad genial ,simplemente todo queda inscrito dentro de q'[…..]'

Inclusive, todo puede quedar inscrito dentro de cualquiera de estos símbolos

!
[ ]
{ }
( )
< >

O sea, nuestro pequeño update dinámico quedaría

var_sql := 'update '|| var_tabla ||' set campo1 = q'[ 'valor literal' ]';

Acaso no se ve más sencillo , mmmmm , claro que sí !!!!

by Ligarius
17.05.10. 14:33:15. 329 words, 8062 views. Categories: Sql*Plus ,

Como crear ROLES de consulta sobre toda la base de datos, de forma fácil



La pregunta es la siguiente

".. Necesito generar un usuario que sea de sólo lectura para toda mi base de datos .."

Pues bien , eso se puede hacer con el siguiente script

click en el LINK



, los pasos para llevarlo a cabo

1.- Copiar el archivo a una ruta fácil de repetir :yes: , no colocar en Documents and Settings, etc ..etc ..etc ;D


2.- Ejecutar el archivo de la forma

sqlplus usuario/password@string_conexion @archivo.sql

3.- En el script va a aparecer una consulta con respecto al nombre del usuario

Ingrese usuario a crear con solo roles de lectura :

4.- Además aparece una pregunta si es VoC ,

V = Implica que se mostrará el comando (Visualizar)
C = Implica que se ejecutará el comando (Crear)

Desea visualizar o crear (V o C)? :

5.- Con lo anterior se crearán roles con el prefijo ROLSER_nombre_de_esquema

6.- Se creará el usuario con grant de connect y se le asignarán todos los roles generados

En resumidas cuentas, un comando , para esa ingrata tarea ... de enrolar

Espero les sirva

by Ligarius
26.01.10. 14:00:00. 180 words, 14486 views. Categories: Base de datos, SQL / Programación, Cosas varias, Sql*Plus ,

Sql*Plus : Como conectarse a una base de datos con problema (opción _prelim de Sql*Plus)



A veces queremos conectarnos a una instancia Oracle, y lo hacemos , como no, con el usuario más poderoso que existe, con SYS como SYSDBA, pero ni eso resulta y simplemente no podemos conectarnos :(

Pues bien , para esos momentos de desdicha, podemos hacer dos cosas

  • O reiniciar la instancia
  • O buscar los porque..
  • Y como somos DBA de peso, queremos saber el por que, cierto?? :yes:



    Pues bien, para realizar esa gran tarea de análisis, ocupamos un comando no documentado de Sql*Plus llamado la conección preliminar, con lo cual no nos conectamos a la instancia Oracle, pero... tenemos acceso a muchas vistas del diccionario de datos :>> , así tal cual , realizamos una conección pero sin conectarnos


    Acá va el ejemplo de ello

    Seteamos la opción oculta llamada "Conexión preliminar"

    [oracle@oracle10g oracle]$ sqlplus /nolog

    SQL*Plus: Release 10.2.0.4.0 - Production on Thu Aug 26 04:20:56 2010

    Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

    SQL> set _prelim on


    Posterior a eso, realizamos la conexión a la base de datos, pero esto en realidad no realizará la conexión , de hecho si tratará de hacerlo se quedaría pegada.

    SQL> conn / as sysdba
    Prelim connection established


    Si quisieramos ejecutar alguna consulta , aparecería el siguiente mensaje

    SQL> select file_name from dba_data_files;
    select file_name from dba_data_files
    *
    ERROR at line 1:
    ORA-01012: not logged on

    SQL>


    Y esto es porque en realidad, no hemos hecho la conexión, pero si podemos obtener información estadística, por ejemplo para hacer un trace de la sesión y así poder detectar el error.

    Para realizar el comentado trace, podemos ocupar otro utilitario no documentado :>> parece cuento , este utilitario es el oradebug , para ello ocupamos los siguientes comandos.

    SQL>
    SQL> oradebug setmypid
    Statement processed.
    SQL> oradebug unlimit
    Statement processed.
    SQL> oradebug hanganalyze 3
    Hang Analysis in /u01/app/oracle/admin/orcl/udump/orcl_ora_5417.trc


    Ahora viene la explicación de los comandos utilizados

  • oradebug setmypid : Es un debug para el actual proceso que ejecuto el comando
  • oradebug hanganalyze 3 : Este comando sirve para generar un trace por HANG de la base de datos, de acuerdo al nivel que se le ha otorgado
  • Este nivel puede ser :

  • 1 y 2 : Sólo un análisis de HANG
  • 3 : Nivel 2 más los procesos con HANG
  • 4 : Nivel 3 más un vacíado de información de los bloqueadores
  • 5 : Nivel 4 más un vacíado de todos los procesos involucrados en el HANG
  • 10 : Un volcado de todos los procesos existentes (muy costoso)
  • Y claro , ahora viene la revisión del archivo de trace generado , la visualización del problema y el reinicio de la instancia Oracle ;)

    El tamaño del archivo de trace esta dado por el parámetro MAX_DUMP_FILE_SIZE , pero si queremos un tamaño mayor , ejecutamos el comando

    SQL> oradebug unlimit

    Antes de hacer el debug del trace

    Espero les sirva

    by Ligarius
    27.08.09. 18:19:56. 480 words, 28062 views. Categories: Base de datos, Tuning / Performance, Sql*Plus ,