domingo, 13 de octubre de 2013

La Columna Table_Lock y el Error ORA-00069

Probé este ejemplo en Oracle 11.2.0.2.7. Un colega quería saber cual era el  propósito de la columna table_lock en la vista dba_tables. Yo no sabía y por lo tanto decidí investigar. Para empezar, miré los valores en la columna table_lock en una base de datos de prueba: 

SQL> select table_lock, count(*)
  2  from dba_tables
  3  group by table_lock
  4  / 

TABLE_LOCK   COUNT(*)
---------- ----------
ENABLED          2760

SQL>

Esto me hizo pensar que el valor predeterminado fuese ENABLED. Para confirmar esta teoría, creé una tabla de prueba: 

SQL> create table andrew (col1 number)
  2  /
 
Tabla creada.
 
SQL>

Como se esperaba, la columna table_lock tenía un valor de ENABLED para esta tabla nueva: 

SQL> l
  1  select table_lock from user_tables
  2* where table_name = 'ANDREW'
SQL> /
 
TABLE_LOCK
----------
ENABLED

SQL>

Se puede cambiar el valor de table_lock de la manera siguiente:

SQL> alter table andrew disable table lock
  2  /
 
Tabla modificada.

SQL>

Tras hacer esto, el valor de table_lock cambia a DISABLED: 

SQL> select table_lock from dba_tables
  2  where table_name = 'ANDREW'
  3  /
 
TABLE_LOCK
----------
DISABLED

SQL>

Luego no es posible tener un bloqueo en la tabla:

SQL> l
  1* lock table andrew in share mode
SQL> /
lock table andrew in share mode
           *
ERROR en linea 1:
ORA-00069: no se puede obtener el bloqueo -- bloqueos
de tabla desactivados para ANDREW

SQL>

Tampoco es posible cambiar la tabla de cualquier manera. Por ejemplo, no se puede renombrarla: 

SQL> rename andrew to fred
  2  /
rename andrew to fred
*
ERROR en linea 1:
ORA-00069: no se puede obtener el bloqueo -- bloqueos
de tabla desactivados para ANDREW
 
SQL>

Si quieres hacer estas cosas, es necesario cambiar table_lock a ENABLED: 

SQL> alter table andrew enable table lock
  2  /
 
Tabla modificada.
 
SQL>

Entonces se puede cambiar la tabla otra vez:

SQL> rename andrew to fred
  2  /
 
Nombre de tabla cambiado.
 
SQL>

Así se puede ver que cuando table_lock sea ENABLED, Oracle te permite tener bloqueos en la tabla y cambiar su definición.

En inglés / in English

No hay comentarios:

Publicar un comentario