viernes, 23 de octubre de 2009

Qué son los objetos nombrados con el patrón SYS_Cxxx en la base de datos

Cuando creamos una política de restricción ( constraint ) o un índice, Oracle requiere que dicha política se le asigne un nombre. Si no lo hacemos, la base de datos tiene un mecanismo que permite asignarle de forma dinámica nombres a los índices, constraints y particiones.

Es recomendado para una administración más eficiente, que seamos nosotros mismos, quienes le otorguemos el nombre a dichos objetos, para que sean representativos y nos puedan dar una pista, del mecanismo que ha sido activado en caso de una violación de política, como por lo ejemplo, sucede con un índice o contraint.

Veamos un ejemplo.

Creamos una tabla simple con algunos campos:

CEMACONAF: ALPHA> create table t1(campo1 varchar2(10), campo2 varchar2(5), campo3 number);

Tabla creada.

CEMACONAF: ALPHA> desc t1
Nombre ¿Nulo? Tipo
----------------------------------------- -------- ----------------------------
CAMPO1 VARCHAR2(10)
CAMPO2 VARCHAR2(5)
CAMPO3 NUMBER

Ahora vamos a agregarle un constraint de llave primaria a la tabla:

USER1: LAB1> alter table t1 add primary key(campo1);

Tabla modificada.

Como vieron anteriormente, no le dimos un nombre a la política creada sobre la tabla T1, por tanto si consultamos el diccionario de la base de datos, vamos a ver como tenemos un índice y un constraint, asociado a la tabla con un nombre que sigue la nomenclatura de SYS_C.

USER1: LAB1> select index_name, owner from dba_indexes where table_name='T1';

INDEX_NAME OWNER
------------------------------ ------------------------------
SYS_C0090105 USER1

USER1: LAB1> select constraint_name, owner from dba_constraints where table_name='T1';

CONSTRAINT_NAME OWNER
------------------------------ ------------------------------
SYS_C0090105 USER1

Vamos a probar la utilidad del constraint:

USER1: LAB1> insert into t1 values('PRIMERO','ROW1',1);

1 fila creada.

USER1: LAB1> insert into t1 values('PRIMERO','ROW2',1);
insert into t1 values('PRIMERO','ROW2',1)
*
ERROR en línea 1:
ORA-00001: unique constraint (USER1.SYS_C0090105) violated

Como pueden observar, cuando ingresamos el valor repetido para la columna a la cuál hemos asociado la política de llave primaria, cuya validación implica, que no pueden haber valores repetidos en el campo o campos asociados a la restricción, el mensaje que me devuelve la herramienta, no es claro en cuanto a que política estamos violando.

Vamos a modificar el constraint definido previamente, asignando un nombre que represente a la tabla asociada, de tal forma que cuando la política sea violada, tengamos información de primera mano, cuál es el objeto afectado.

USER1: LAB1> alter table t1 add constraint pk_tabla1_campo1 primary key(campo1);
alter table t1 add constraint pk_tabla1_campo1 primary key(campo1)
*
ERROR en línea 1:
ORA-02260: table can have only one primary key


USER1: LAB1> alter table t1 drop primary key;

Tabla modificada.

USER1: LAB1> alter table t1 add constraint pk_tabla1_campo1 primary key(campo1);

Tabla modificada.

Volvemos a consultar la información de los índices y los constraint definidos para la tabla T1 y la información asociada ahora en el diccionario de la base de datos es la siguiente:

USER1: LAB1> select index_name, owner from dba_indexes where table_name='T1';

INDEX_NAME OWNER
------------------------------ ------------------------------
PK_TABLA1_CAMPO1 USER1

USER1: LAB1> select constraint_name, owner from dba_constraints where table_name='T1';

CONSTRAINT_NAME OWNER
------------------------------ ------------------------------
PK_TABLA1_CAMPO1 USER1

A la hora de ingresar el registro, que no cumple con la especificación de ser único en la columna CAMPO1, la herramienta nos devuelve el mensaje de "ORA-00001: unique constraint (USER1.PK_TABLA1_CAMPO1) violated ".

USER1: LAB1> insert into t1 values('PRIMERO','ROW2',1);
insert into t1 values('PRIMERO','ROW2',1)
*
ERROR en línea 1:
ORA-00001: unique constraint (USER1.PK_TABLA1_CAMPO1) violated

USER1: LAB1>

No hay comentarios:

Publicar un comentario

Te agradezco tus comentarios. Te esperamos de vuelta.

Todos los Sábados a las 8:00PM

Optimismo para una vida Mejor

Optimismo para una vida Mejor
Noticias buenas que comentar