miércoles, 4 de julio de 2012

9.1. CREAR Y MODIFICAR TABLAS

CREAR Y MODIFICAR TABLAS.
La Base de Datos Oracle soporta varios tipos de Tablas Permanentes: Heap Tables, Indexorganized Tables, Partitioned Tables y Clustered Tables. Este capítulo solo trata con la Básica Heap Table. La Tablas existen dentro de los esquemas y deben ajustarse a las reglas para nombrar objetos de esquema. Las columnas de una tabla son definidas como ciertos Tipos de Datos.

USUARIOS, CUENTA DE USUARIO, ESQUEMAS Y OBJETOS DE ESQUEMA.
Un usuario es una persona que se conecta a la Base de Datos de un proceso usuario y se conecta a una cuenta de usuario. El capitulo 8 cubre las técnicas para crear cuentas de usuario y darles los privilegios que permitan a ellos conectarse a la Base de Datos, y entonces crear y usar objetos. Cuando una cuenta de usuario es creada, un esquema es creado también. Un esquema consiste de los objetos propiedad de la cuenta. Inicialmente, va estar vacio, un esquema es un contenedor para tablas, vistas, código y otros objetos de base de datos. Mucha gente utiliza los términos “User”, “User account” y “Schema” de manera intercambiable. En el entorno Oracle, usted puede salirse con la suya (aunque no necesariamente con otros sistemas de bases de datos).
Algunos esquemas siempre estarán vacios: el usuario nunca creara cualquier objeto, porque él no necesita hacer y (si se configura correctamente) no tendrá los privilegios necesarios de todos modos. Usuarios como estos se han concedido permisos, ya sea atraves de privilegios directos o por medio de roles, para usar Código y acceso a datos en otros sistemas, pertenecientes a otros usuarios. Otros usuarios pueden ser el revés de esto: poseerán muchos objetos pero nunca abrirán una sesión en la Base de Datos. Ni siquiera se han concedido el privilegio de CREATE SESSION, por lo que la cuenta esta deshabilitada efectivamente (o de hecho puede ser bloqueada). Estos esquemas son usados como Repositorios de código y datos, accedidos por otros. 
Objetos de Esquemas son objetos con un propietario. El identificador único para un objeto de un tipo particular no es su nombre-esto es su nombre, prefijado con el nombre del esquema al cual pertenece este. Así, la Tabla HR.REGIONS es una tabla llamada REGIONS que es propiedad del usuario HR. Podría haber otra tabla SYSTEM.REGIONS, que sería una tabla completamente diferente propiedad del usuario SYSTEM, y (tal vez diferentes en estructura y contenido) residente en ese esquema de usuario.  Una serie de usuarios ( y sus esquemas asociados) son creados automáticamente en tiempo de creación de la Base de Datos. Principal entre estos son SYS y SYSTEM. El usuario SYS propietario del Diccionario de Datos: un conjunto de tablas (en el Esquema SYS) que definen la Base de Datos y su contenido. SYS también es propietario de varios cientos de paquetes PL/SQL: código  que se proporciona para el uso de los Administradores de Bases de Datos y Desarrolladores. Los objetos en el Esquema SYS nunca deberían ser modificados con comandos DML. Si fueron ejecutados DML contra las Tablas del Diccionario de Datos, se correría el riesgo de corromper el diccionario de datos, con resultados desastrosos. Actualizar el Diccionario de Datos ejecutando comandos DDL (tales como CREATE TABLE), que proporciona una capa de abstracción entre el usuario y el diccionario de Datos. El esquema SYSTEM almacena varios objetos adicionales utilizados para administración y supervisión.
Dependiendo de las opciones seleccionadas durante la Creación de la Base de Datos, puede haber más usuarios creados-quizás hasta treinta en total. Estos otros son utilizados para almacenar código y datos requeridos por varias opciones. Por ejemplo, el usuario MDSYS almacena los objetos utilizados por Oracle Spatial, una opción que amplía las capacidades de la Base de Datos Oracle para gestionar Información Geográfica.

NOMBRAR OBJETOS DE ESQUEMA.
Un objeto de esquema es un objeto que es propietario de un usuario. La Base de Datos también contiene objetos non_schema (que no son de esquema); estos pueden ser objetos que no tienen  que ver con los usuarios,  tales como Tablespace, o en algunos casos son objetos propiedad de SYS y directamente accesible por todos los usuarios; ejemplo de estos últimos incluyen los sinónimos públicos y los public Database Links que pueden ser utilizados por todos los usuarios independientemente de los privilegios. 
Para ver los objetos de esquema atreves del Database Control, tome el link apropiado por el tipo de objeto de interés, la ficha de Esquema en la Pagina principal del Database Control, como lo muestra la figura 9-1, y se le pedirá  a los criterios de búsqueda diferentes. 
Todos los nombres de Objetos de Esquema deben ajustarse por ciertas reglas:

El nombre puede ser de uno a treinta caracteres de longitud, con excepción de los nombres de los Database Link, que pueden ser hasta 128 caracteres de longitud.
Palabras reservadas (tales como SELECT) no pueden ser utilizadas en nombres de objetos.
Todos los nombres deben iniciar con una letra de la A a la Z.
Los nombres solo pueden usar letras, números, guion bajo, el signo de dólar ($), o el signo de numero (#).
Letras minúsculas serán convertidas a mayúsculas.





Al encerrar el nombre dentro de comillas dobles, todas estas reglas (con la excepción de la Longitud) se puede romper, pero para obtener el objeto  posteriormente debe siempre ser especificado con doble comillas, como en el ejemplo de la Figura 9-2. Tenga en cuenta que algunas restricciones se aplican a los nombres de columnas. Aunque las herramientas tales como SQL*Plus automáticamente se convertirán las letras de minúsculas a mayúsculas, a menos que el nombre sea incluido dentro de comillas dobles, recuerde que nombres de objetos son siempre case sensitive. En este ejemplo, las dos tablas son completamente diferentes:

ocp10g> create table lower(c1 date);
Table created.
ocp10g> create table "lower"(col1 varchar(2));
Table created.
ocp10g> select table_name from dba_tables where
2 lower(table_name) = 'lower';
TABLE_NAME
------------------------------
lower
LOWER

EXAMEN
Las Tablas no pueden utilizar palabras reservadas en sus nombres; deben iniciar con una letra; y pueden incluir solo de letras, dígitos y guion bajo, signo de dólar, y signo numeral.





EN EL TRABAJO.
Mientras es posible utilizar nombres en minúsculas y caracteres non-standard (incluso espacios),  es considerado mala práctica  debido a la confusión que esto puede causar.

OBJECT NAMESPACES.
A menudo se dice que el identificador único para un objeto es el nombre de objeto, con el prefijo del nombre de esquema. Mientras esto es generalmente cierto, para una comprensión completa de nombres es necesario introducir el concepto de namespace. Un namespace define un grupo de tipos de objetos, dentro del cual todos los nombres deben ser identificados de forma univoca, por esquema y nombre. Objetos en diferentes namespaces pueden compartir el mismo nombre. 
Estos tipos de objetos todos comparten el mismo namespace:

Tablas.
Vistas.
Secuencias.
Private synonyms
Stand-alone Procedures.
Stand-alone stored functions
Packages.
Materialized views.
User-definied types.
Por lo tanto, es imposible crear una vista con el mismo nombre que una tabla-al menos, es imposible si están en el mismo esquema. Y una vez creado, las sentencias SQL pueden direccionar una vista como si fuera una tabla. El hecho que las tablas, vistas y prívate synonyms comparten el mismo namespace significa que usted puede configurar varias capas de abstracción entre lo que los usuarios ven y las tablas reales. Que pueden ser muy valiosas para seguridad y para simplificar el desarrollo de aplicaciones. 
Estos tipos de objetos cada uno tiene su propio namespace:

Indexes.
Constraints.
Clusters.
Database Triggers.
Private Database Links.
Dimensions.

Por lo tanto, es posible (aunque tal vez no es una buena idea) para un índice tener el mismo nombre como una tabla, incluso dentro del mismo esquema.

EXAMEN
Dentro de un esquema, Tables, views y synonyms no pueden tener el mismo nombres.

TIPOS DE DATOS.
Cuando creamos Tablas, cada columna se debe asignar un tipo de datos, que determina la naturaleza del valor que puede ser insertado en la columna. Estos tipos de datos son también utilizados para especificar la naturaleza de los argumentos  de los Store Procedures y functions. Cuando seleccionamos un tipo de datos, usted debe considerar los datos que usted necesita almacenar y las operaciones que usted desarrollara sobre ellos. Puede ser posible cambiar una columna a un diferente tipo de dato después de la creación. Pero esto no es siempre fácil. El espacio es también una consideración: algunos tipos de datos son de longitud fija, teniendo el mismo número de bytes sin importar lo que actualmente este en ellos; otros son variables. Si una columna no es llenada, entonces oracle no le dará ningún espacio en lo absoluto; si usted más tarde actualiza e registro para llenar la columna, entonces, la fila se hace más grande, no importa si el tipo de datos es longitud fija o variable.
Tipos de Datos para Datos Alfanuméricos:
VARCHAR2 Dato de longitud variable de caracteres, de 1 byte a 4kb. Los datos son almacenados en la base de datos en conjunto de caracteres. 
NVARCHAR2 Como  VARCHAR2, pero los datos son almacenados en un juego de caracteres alternativo de la lengua nacional: uno de los permitidos es el juego de caracteres Unicode.
CHAR Dato de longitud fija de carácter, de 1 byte a 2 kb, en el juego de caracteres de la base de datos. Si los datos no son la longitud de la columna, después serán rellenados con los espacios.
RAW Dato de longitud variable Binario, desde 1 byte a 2kb. A diferencia de los tipos de datos CHAR y VARCHAR, Los datos RAW no son convertidos por Oracle Net del juego de caracteres de la base de datos al juego de caracteres del proceso de usuario de seleccionar, o la otra forma de insertar.

Tipos de Datos para Datos Numéricos, todas las de longitud variable:
NUMBER Dato numérico, para cual usted puede especificar la precisión y la escala. La precisión puede variar de 1 a 38; la escala puede variar de -84 a 127.
FLOAT Este es un tipo de dato del ANSI, numero de punto flotante con precisión de 126 binario (o 36 decimal).
INTEGER Equivalente a NUMBER, con escala cero.

Tipos de Datos para Fecha y Tiempo, todos de longitud fija:
DATE este puede ser longitud Cero, si la columna esta vacía, o 7 Bytes. Todos los datos de la Fecha incluye siglo, año, mes, día, hora, minuto y segundo. El rango valido es de 1 Enero 4712 AC a 31 diciembre de 9999 DC.
TIMESTAMP este es de longitud cero si la columna esta vacía, o hasta 11 bytes, dependiendo de la precisión especificada. Similar a DATE, pero con una precisión de hasta nueve decimales para los segundos, seis lugares por defecto.
TIMESTAMP WITH TIMEZONE como TIMESTAMP, pero los datos se almacenan con un registro guardando de la zona horaria a la que se refiere. La longitud puede ser hasta 13 Bytes, dependiendo de la precisión. Este tipo de dato permite a Oracle determinar la diferencia entre dos horas por la normalización de ellos a la hora UTC. Incluso si los tiempos son para zonas horarias diferentes.
TIMESTAMP WITH LOCAL TIMEZONE como TIMESTAMP, pero los datos se normalizan a la zona horaria de la Base de Datos, cuando se recupera, se normaliza a la zona horaria del proceso usuario seleccionado.
INTERVAL YEAR TO MONTH se utiliza para la grabación de un periodo de años y meses entre dos DATE o TIMESTAMPs.
INTERVAL DAY TO SECOND utilizado para guardar un periodo de días y segundos entre dos DATES o TIMESTAMPs.

Tipos de Datos de Objetos Grandes:

CLOB los Datos de carácter almacenados en el juego de caracteres de la Base de Datos, tamaño prácticamente ilimitado: 4GB multiplicado por el tamaño de Database Block.
NCLOB  como CLOB, pero los datos son almacenado en un juego de caracteres alternativo: uno de los juego de caracteres Unidode permitidos.
BLOB como CLOB, pero datos binarios que no se someterán a la conversión del juego de caracteres por Oracle Net.
BFILE un localizador que apunta a un archivo almacenado en el sistema operativo del servidor de base de datos. El tamaño de los archivos está limitado a 4 GB.
LONG Datos carácter en el juego de caracteres de la Base de Datos, hasta 2 GB. Toda la funcionalidad de LONG es proporcionada por CLOB, LONG no debe ser utilizada en una Base de Datos moderna, y si su Base de Datos tiene columnas de este tipo, debe ser convertido a CLOB.
LONG RAW como LOG, pero datos binarios que no serán convertidos por Oracle Net cualquier columna LONG RAW debe ser convertida a BLOB.

EN EL TRABAJO
Para la conformidad ISO/ANSI, usted puede especificar un tipo de Dato VARCHAR cuando creas Tablas, pero cualquier columna de este tipo será automáticamente convertida a VARCHAR2.

Oracle provee un rango de typecasting para conversión entre tipos de datos, y en algunas circunstancias hará typecasting automáticamente, la figura 9-3 ilustra ambas técnicas.
En la figura, el primer insert utiliza funciones typecasting para convertir los datos carácter introducidos a el tipo de dato de la columna de la Tabla. El segundo insert intenta insertar cadena de caracteres en las tres columnas, pero el insert todavía tiene éxito porque Oracle puede convertir tipos de datos automáticamente si es necesario, y si el formato de los datos es adecuado. Tenga en cuenta que la exactitud del typecasting puede ser dependiente de los datos. En este ejemplo, la fecha es interpretada como una fecha estilo europea (dia-mes-año), cuál no pudo ser pensado si los usuarios suceden utilizar estilos americanos (mes-dia-año) que emite un error, o estilo africano (año-mes-día), que iba a funcionar, pero no pretende ser.

EN EL TRABAJO
No confié en el Typecasting automático, puede impactar en le rendimiento y no siempre funciona. El entorno Oracle es inflexible de tipos, y sus programadores deberían respetar esto.





CREANDO TABLAS
La sintaxis para crear una tabla requiere dar el Nombre de la Tabla (Cual debe ser único dentro del namespace en el esquema al cual la tabla pertenece) y especificar una o más columnas, cada una con un tipo de dato. También es posible especificar Constraints (restricciones) cuando crea una Tabla; alternativamente, los Constraints puede ser añadidos posteriormente. Hay muchos ejemplos en este libro de creación de tablas desde la línea de comandos de SQL PLUS (ha habido ya dos ejemplos en este capítulo), pero también puede ser hecho atraves del Database Control. Database Control provee una interfaz completamente funcional basada en menús para la creación y edición de estructuras de tablas. 
Todas las tablas requieren de almacenamiento. A menos que se especifique lo contrario, las tablas serán creadas con un Extent en el Tablespaces por default del creador. Cualquier otro Tablespace en cual el usuario tiene una cuota puede ser especificado en el tiempo de creación. O una tabla puede ser movida a un Tablespace diferente posteriormente. 
Para llegar a la ventana de gestión de Tablas de Database Control, desde la pagina principal del Database Control tome la ficha Esquema, luego el Link Tablas en la sección de Objetos de Base de Datos, como se muestra en la figura 9-4. Ingrese cualquier criterio de búsqueda necesarios para localizar una tabla de interés; tome en cuenta que comillas dobles pueden ser utilizados para encontrar tablas con nombre no estándar  y el comodín %.  Dar clic en la lista desplegable de acciones para ver qué posibilidades están disponibles.

Las acciones son:


El botón Edit va a un ventana que desplegara la estructura de columnas de la Tabla. Desde aquí, columnas pueden ser agregados, eliminados y modificados. Por ejemplo  SQL para hacer esto son:

alter table dept add (started date);
alter table dept modify (started timestamp);
alter table dept drop column started;

En este ejemplo, el primer comando agrega una columna STARTED a la Table, tipo de dato DATE. El segundo comando modifica el tipo de dato a TIMESTAMP. El tercer comando elimina la columna.





Para eliminar una tabla, utilice el comando DROP TABLE. Sintácticamente, esto es muy simple:

DROP TABLE table_name [CASCADE CONSTRAINTS] ;

Cuando una table es Eliminada, todos los índices y trigers asociados serán eliminados también. Los Constraint serán eliminados. Aunque si la tabla es la tabla padre en un Constraint de clave  externa (Foreign Key Constraint),  la eliminación fallara a menos que sea especificado la palabra CASCADE CONSTRAINT.

EJERCICIO 9-1.
CREAR Y MODIFCAR TABLAS.
En este ejercicio, utilice SQL PLUS para crear y modificar una simple tabla, y luego utilice el Database Control para extraer el DDL necesario para recrear esto.

1. Conéctese a su Base de Datos con SQL PLUS como usuario HR.
2. Crear una tabla como sigue:
create table ex_emps as select * from employees where 1=2;
Esto creara una table vacia, en el Tablespace default de HR, destinada a almacenar los detalles del persona que han sido despedidos.
3. Remover las columnas no relevantes para exemployees:
alter table ex_emps drop column email;
alter table ex_emps drop column phone_number;
4. Agregar columnas  necesarias en la nueva Tabla:
alter table ex_emps add (fire_date date);
alter table ex_emps add(reason varchar2(20));
5. Conectarse a la Base de datos con Database Control como usuario SYSTEM.
6. Localice la nueva tabla Creada. La ruta de navegación es tomar la ficha Esquema de la página principal de la Base de Datos. Y dar clic en el Link Tables en la sección Objetos de Base de Datos. Ingrese HR como criterio de búsqueda en dar clic en seguir. Esto localizara todas las tablas de HR.
7. Seleccione el Radio Button de la Tabla EX_EMPS, generar DDL en la lista de acciones, y dar clic en Ir. El DDL generados se parecerá a la que se muestra en la ilustración:





8. Estudie el DDL generado. Tenga en cuenta que no es nada como la especificada en el paso 2: dobles comillas son utilizados alrededor de todos los nombres, Constraints NOT NULL han sido copiados, pero no a otros; por defecto se han aplicado para Tablespaces, almacenamiento y la  LOGGING y COMPRESS opciones.

No hay comentarios:

Publicar un comentario