miércoles, 23 de abril de 2014

Vínculos a Bases de Datos con Contraseñas Sensibles al Uso de Mayúsculas y Minúsculas

Me conecté a una base de datos en Oracle versión 11:

Oracle 11: sqlplus / as sysdba
 
SQL*Plus: Release 11.2.0.1.0 Production on Wed Apr 23 18:22:40 2014
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL>

Creé un usuario con una contraseña hecha de minúsculas:

SQL> create user user1 identified by pw1
  2  /
 
User created.
 
SQL> grant create session to user1
  2  /
 
Grant succeeded.
SQL>

Luego me conecté a la base de datos con este usuario dos veces para probar que la verificación de la contraseña fuese sensible al uso de mayúsculas y minúsculas:

SQL> conn user1/pw1
Connected.
SQL> conn user1/PW1
ERROR:
ORA-01017: invalid username/password; logon denied
 
Warning: You are no longer connected to ORACLE.
SQL> 

Creé un usuario con una contraseña hecha de mayúsculas: 

SQL> conn / as sysdba
Connected.
SQL> create user user2 identified by PW2
  2  /
 
User created.
 
SQL> grant create session to user2
  2  /
 
Grant succeeded.
SQL>

Entonces hice las mismas pruebas con la contraseña: 

SQL> conn user2/pw2
ERROR:
ORA-01017: invalid username/password; logon denied
 
Warning: You are no longer connected to ORACLE.
SQL> conn user2/PW2
Connected.
SQL> 

Me conecté a una base de datos en Oracle versión 9 en otro servidor: 

Oracle 9: sqlplus "/ as sysdba"
 
SQL*Plus: Release 9.2.0.7.0 - Production on Wed Apr 23 18:34:33 2014
 
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
 
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.7.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.7.0 - Production
 
SQL> 

Luego, desde la base de datos en Oracle 9, me conecté cuatro veces a la base de datos en Oracle 11. La verificación de las contraseñas funcionó todavía:

SQL> conn user1/pw1@busdpt1
Connected.
SQL> conn user1/PW1@busdpt1
ERROR:
ORA-01017: invalid username/password; logon denied
 
Warning: You are no longer connected to ORACLE.
SQL> conn user2/pw1@busdpt1
ERROR:
ORA-01017: invalid username/password; logon denied
 
SQL> conn user2/PW2@busdpt1
Connected.
SQL>

Creé un usuario en Oracle 9 que sería el dueño de unos vínculos a la base de datos en Oracle 11: 

SQL> conn / as sysdba
Connected.
SQL> create user link_owner identified by link_owner
  2  /
 
User created.
 
SQL> grant create session, create database link
  2  to link_owner
  3  /
 
Grant succeeded.
 
SQL>

Entonces creé dos vínculos al usuario con la contraseña hecha de minúsculas. El primer vínculo empleó una contraseña hecha de minúsculas y el segundo empleó una contraseña hecha de mayúsculas. Ninguno de los vínculos funcionó: 

SQL> conn link_owner/link_owner
Connected.
SQL> create database link link1
  2  connect to user1 identified by pw1
  3  using 'BUSDPT1'
  4  /
 
Database link created.
 
SQL> select * from dual@link1
  2  /
select * from dual@link1
                   *
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from LINK1
 
SQL> create database link link2
  2  connect to user1 identified by PW1
  3  using 'BUSDPT1'
  4  /
 
Database link created.
 
SQL> select * from dual@link2
  2  /
select * from dual@link2
                   *
ERROR at line 1:
ORA-01017: invalid username/password; logon denied
ORA-02063: preceding line from LINK2
 
SQL>

Por fin, creé dos vínculos al usuario con la contraseña hecha de mayúsculas. El primer vínculo empleó una contraseña hecha de minúsculas y el segundo empleó una contraseña hecha de mayúsculas. Ambos funcionaron: 

SQL> create database link link3
  2  connect to user2 identified by pw2
  3  using 'BUSDPT1'
  4  /
 
Database link created.
 
SQL> select * from dual@link3
  2  /
 
D
-
X
 
SQL> create database link link4
  2  connect to user2 identified by PW2
  3  using 'BUSDPT1'
  4  /
 
Database link created.
 
SQL> select * from dual@link4
  2  /
 
D
-
X
 
SQL>

Esto me sugiere que una base de datos en Oracle 9 envia la contraseña para un vínculo en mayúsculas. Por eso, si usted quiere crear un  vínculo desde Oracle 9 hasta Oracle 11, es necesario conectarse a un usuario que tiene una contraseña hecha de mayúsculas.

En inglés 

lunes, 14 de abril de 2014

Como se Puede Renombrar una Tabla

Probé este ejemplo en Oracle 12.1. Para empezar, creé una tabla:

SQL> create table fred
  2  as select * from user_synonyms
  3  where 1 = 2
  4  /
Tabla creada.

SQL>

Luego miré su número de identificación en user_objects:

SQL> select object_id
  2  from user_objects
  3  where object_name = 'FRED'
  4  /
 
OBJECT_ID
----------
     92212

SQL>

... y hice una descripción de la tabla:

SQL> desc fred
Nombre                     ¿Nulo?   Tipo
-------------------------- -------- ------------------
SYNONYM_NAME               NOT NULL VARCHAR2(128)
TABLE_OWNER                         VARCHAR2(128)
TABLE_NAME                 NOT NULL VARCHAR2(128)
DB_LINK                             VARCHAR2(128)
ORIGIN_CON_ID                       NUMBER

SQL>

Entonces cambié el nombre de la tabla:
 
SQL> rename fred to joe
  2  /
 
Nombre de tabla cambiado.

SQL>

... y por fin, para probar que todavía estaba mirando el mismo objeto, empleé el nombre nuevo para verificar que el número de identificación y la descripción no habían cambiado: 

SQL> select object_id
  2  from user_objects
  3  where object_name = 'JOE'
  4  /
 
OBJECT_ID
----------
     92212
 
SQL> desc joe
Nombre                     ¿Nulo?   Tipo
-------------------------- -------- ------------------
SYNONYM_NAME               NOT NULL VARCHAR2(128)
TABLE_OWNER                         VARCHAR2(128)
TABLE_NAME                 NOT NULL VARCHAR2(128)
DB_LINK                             VARCHAR2(128)
ORIGIN_CON_ID                       NUMBER
 
SQL>

En inglés 

miércoles, 2 de abril de 2014

Compilación Interpretada y Nativa en Oracle 11.2

Hay dos tipos de compilación, es decir, interpretada y nativa. Tras hacer una compilación nativa de un procedimiento, Oracle no tiene que interpretarlo antes de ejecutarlo. Por eso, el procedimiento puede terminar más rápidamente. La diferencia es más grande en procedimientos con cálculos y bucles etc y menos grande en procedimientos con SQL. Hice las pruebas bajo estas líneas para mostrar esta característica en Oracle 11.2. (Según la documentación escrita por Oracle, compilación nativa era diferente en versiones anteriores.) Para hacer unas compilaciones interpretadas, ejecuté el comando siguiente:

SQL> alter session set plsql_code_type = 'INTERPRETED'
  2  /

Sesión modificada.

SQL>

Luego creé un procedimiento con cálculos y bucles: 

SQL> create or replace procedure prueba_de_velocidad1 as
  2    z number;
  3  begin
  4    for x in 1..10000 loop
  5      for y in 1..10000 loop
  6        z := x * y;
  7      end loop;
  8    end loop;
  9  end;
 10  /

Procedimiento creado.

SQL>

... y otro con SQL:

SQL> create or replace procedure prueba_de_velocidad2 as
  2    cursor c1 is select a.table_name
  3    from dba_tables a, dba_tables b;
  4  begin
  5    for c1_rec in c1 loop
  6      null;
  7    end loop;
  8  end;
  9  /

Procedimiento creado.

SQL>

Para hacer unas compilaciones nativas, ejecuté el comando siguiente:

SQL> alter session set plsql_code_type = 'NATIVE'
  2  /

Sesión modificada.

SQL> create or replace procedure prueba_de_velocidad3 as
  2    z number;
  3  begin
  4    for x in 1..10000 loop
  5      for y in 1..10000 loop
  6        z := x * y;
  7      end loop;
  8    end loop;
  9  end;
 10  /

Procedimiento creado.

SQL> create or replace procedure prueba_de_velocidad4 as
  2    cursor c1 is select a.table_name
  3    from dba_tables a, dba_tables b;
  4  begin
  5    for c1_rec in c1 loop
  6      null;
  7    end loop;
  8  end;
  9  /

Procedimiento creado.

SQL>

Así tenía cuatro procedimientos:

  • Prueba_de_velocidad1: Compilación interpretada de cálculos y bucles.
  • Prueba_de_velocidad2: Compilación interpretada de SQL.
  • Prueba_de_velocidad3: Compilación nativa de cálculos y bucles.
  • Prueba_de_velocidad4: Compilación nativa de SQL.

Luego hice las pruebas:

SQL> set timing on
SQL> exec prueba_de_velocidad1;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:08.11
SQL> exec prueba_de_velocidad3;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:05.98
SQL> exec prueba_de_velocidad2;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:46.04
SQL> exec prueba_de_velocidad4;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:45.50
SQL>

...y miré los resultados:

  • Prueba_de_velocidad1: Compilación interpretada de cálculos y bucles: 8.11 segundos.
  • Prueba_de_velocidad3: Compilación nativa de cálculos y bucles: 5.98 segundos (una diferencia de 26%).
  • Prueba_de_velocidad2: Compilación interpretada de SQL: 46.04 segundos.
  • Prueba_de_velocidad4: Compilación nativa de SQL: 45.50 segundos (una diferencia de 1%).

Por fin, repetí las pruebas en el orden inverso pero los resultados eran iguales:

SQL> exec prueba_de_velocidad3;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:05.99
SQL> exec prueba_de_velocidad1;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:08.11
SQL> exec prueba_de_velocidad4;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:45.19
SQL> exec prueba_de_velocidad2;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:45.98
SQL> 
SQL> set timing off
SQL>