INSTITUTO SUPERIOR TECNOLÓGICO NORBERT WIENER Manual del Alumno ASIGNATURA: Aplicativos IV (SQL Server / Oracle Administrador) PROGRAMA: S3C Lima-Perú 2 Manual del Alumno 1. QUÈ ES SQL SERVER SQL SERVER es un sistema de administración de base de datos relacionales (RDBMS, Relational Database Management System) cliente – servidor que utiliza transact – SQL para enviar peticiones entre un cliente y SQL Server. 1.1 Arquitectura cliente – servidor SQL Server utiliza la arquitectura cliente – servidor para separar la carga de trabajo en tareas que se ejecuten en equipos servidores y en tareas que se ejecuten en equipos clientes. El cliente es el responsable de la lógica empresarial y de presentar los datos al usuario. Normalmente, el cliente se ejecuta en uno o varios equipos cliente, pero también se puede ejecutar en el equipo servidor con SQL Server. SQL Server administra las bases de datos y asigna los recursos disponibles del servidor, como la memoria, el ancho de banda de la red y las operaciones de disco, entre las distintas peticiones. 1.2 Sistema de administración de base de datos relacionales El sistema de administración de base de datos relacionales 8RDBMS) es el responsable de: Mantener las relaciones entre los datos de la base de datos. Asegurar que los datos estén correctamente almacenados: que no se infrinjan las reglas que se definen las relaciones entre los datos. Recuperar todos los datos hasta un punto de coherencia garantizada en caso de un error del sistema. 1.3 Transact – SQL SQL Server utiliza Transact – SQL, una versión del lenguaje de consulta estructurado (SQL, Structured Query Language), como lenguaje de consultas y programación de sus bases de datos. SQL puede tener acceso a los datos y consultar, actualizar y administrar sistemas de datos relacionales. Los organismos American Nacional Standards Institute (ANSI) e internacional Standards Organización (ISO) han definido los estándares de SQL. Transact – SQL acepta el último estándar SQL ANSI publicado en 1992, llamado ANSI SQL – 92. además de muchas extensiones que amplían sus funciones. 1.4 Integración de SQL Server con Windows NT Seguridad. SQL Server está integrado con el sistema de seguridad de Windows NT. Dicha integración permite utilizar un único nombre de usuario y contraseña para tener acceso a SQL Server y a Windows NT. SQL Server utiliza también las características de cifrado de Windows NT para la seguridad de la red. SQL Server proporciona su propia seguridad para los clientes que no sean sistemas de Microsoft. Soporte para multiprocesador. SQL Server acepta la capacidad de multiproceso simétrico (SMP) de Windows NT. SQL Server aprovecha automáticamente los procesadores adicionales que se agregan al equipo servidor. Visor de sucesos de Microsoft. SQL Server escribe mensajes en los registros de sucesos de aplicación, seguridad y sistemas de Windows NT, que proporcionan un mecanismo coherente para examinar y efectuar el seguimiento de los problemas. 3 Manual del Alumno Servicios de Windows NT. SQL Server se ejecuta como servicio en Windows NT, lo que permite iniciar y terminar SQL Server de forma remota. Monitor de sistema de Windows NT. SQL Server envían medidas de rendimiento al monitor del sistema de Windows NT, que permite supervisar el rendimiento del sistema con SQL Server. Microsoft cluster Server. Microsoft Cluster Server, un componente de Windows NT edición Enterprise, acepta la conexión dos servidores o nodos en un cluster para obtener una mayor disponibilidad y una mejor administración de los datos 4 Manual del Alumno MODULO 3: Administración de la seguridad 1. IMPLEMENTACIÓN DEL MODO DE AUTENTICACIÓN En SQL Server se puede implementar el modo de autenticación de Windows NT o el modo Mixto. Esta sección describe el proceso de cada modo, los pasos que hay que seguir para implementar la autenticación y cómo crear cuentas de inicio de sesión. Proceso de Autenticación Como procesa SQL Server las cuentas de inicio de sesión que autentica Windows NT: Cuando un usuario conecta con SQL Server, el cliente abre una conexión de confianza con SQL Server, que pasa el grupo de y la cuenta de Windows NT del usuario a SQL Server. Como el cliente sabe tiene abierta una conexión de confianza, SQL Server sabe que Windows NT ya ha validado la cuenta de inicio de sesión. Si SQL Server encuentra la cuenta de usuario o de grupo de Windows NT en la lista de cuentas de inicio de sesión de SQL Server que se encuentra en la tabla del sistema syslogins, acepta la conexión. SQL Server no necesita volver a validar la contraseña porque Windows NT y a ala ha validado. Como SQL Server procesa las cuentas de inicio de sesión que el mismo autentica: Cuando un usuario conecta con una cuenta de inicio de sesión y contraseña de SQL Server, este comprueba si existe la cuenta de inicio de sesión en la tabla syslogins y si la contraseña especificada coincide con la contraseña registrada. Si SQL Server no tiene establecida una cuenta de inicio de sesión para el usuario, la autenticación falla y la conexión se rechaza. 5 Manual del Alumno Creación de cuentas de inicio de sesión Master.. syslogins Suid Name Loginname NULL NULL BUILTIN/administrators NULL NULL Accountingdomain/ caroyl 6 Acconuntingdomain/ maría Accountingdomain/ maría 7 Mary mary 1 Sa Sa Puede crear cuentas de inicio de sesión a partir de usuarios y grupos de Windows NT, o puede crear nuevas cuentas de inicio de sesión en SQL Server. Las cuentas de inicio de sesión están almacenadas en la tabla del sistema master... syslogins. Cuando se agrega una cuenta de inicio de sesión a SQL Server, se le suele asignar una base de datos predeterminada. La asignación de una base de datos predeterminada a una cuenta de inicio de sesión no crea una cuenta de usuario en esa base de datos, sino que establece el contexto predeterminado para las acciones que ejecute el usuario. Agregar una cuenta de inicio de sesión de Windows NT a SQL Server . Puede utilizarse el administrador corporativo de SQL Server o el procedimiento almacenado del sistema sp _ grantlogin (sólo los administradores del sistema pueden ejecutarlo) para permitir que una cuenta de usuario o de grupo de Windows NT conecte con SQL Server. Sintaxis: sp_grantlogin {'inicio de sesión'} Inicio de sesión: es el nombre del usuario o grupo de Windows NT que se va agregar. La siguiente tabla enumera otros procedimientos almacenados del sistema que, se pueden usar para administrar cuentas de inicio de sesión de Windows NT. Procedimiento almacenado del sistema sp_revokelogin sp_denylogin Descripción Quita de SQL Server las entradas de cuenta De inicio de sesión de un usuario o grupo de Windows NT. Impide que un usuario o grupo de Windows NT conecte con SQL Server. Agregar una cuenta de inicio de sesión de SQL Server. Puede utilizarse el administrador corporativo de SQL Server o el procedimiento almacenado del sistema sp_ addlogin (solo los administradores del sistema pueden ejecutarlo) para crear una cuenta de inicio de sesión de SQL Server. Sintaxis: sp_ addlogin 'inicio de sesión', 'contraseña',' base de datos' 2. ASIGNACIÓN DE CUENTAS DE INICIO DE SESIÓN A FUNCIONES. Las funciones proporcionan un medio para agrupar usuarios en una sola unidad a la que se pueden aplicar permisos. SQL Server proporciona funciones fijas de servidor, funciones fijas de base de datos y funciones de base de datos definidas por el usuario. Funciones fijas de servidor 6 Manual del Alumno Las funciones fijas del servidor permiten agrupar los privilegios administrativos en el nivel del servidor. Se administran de forma independiente de las bases de datos de usuario en el nivel del servidor y se almacenan en la tabla del sistema master.. syslogins. En la tabla siguiente se muestran algunas: Función Permiso Sysadmin Realizar cualquier actividad Dbcreator Crear y alterar bases de datos Diskadmin Administrar archivos Processadmin Administrar procesos de SQL Server Serveradmin Condigurar el servidor Setupadmin Instalar duplicación Security Administrar y auditar inicios de sesión. Funciones fijas de base de datos. Las funciones fijas de base de datos permiten agrupar los privilegios administrativos en el nivel de base de datos. Las funciones fijas de base de datos están almacenadas en la tabla del sistema sysusers de cada base de datos. En la tabla siguiente se muestran algunas: Función Public db_owner db_ accessadmin db_ddladmin db_securityadmin db_backupoperator db_datareader db_datawriter Permiso Es una función de base de datos especial a la que pertenecen todos los usuarios. Mantiene los permisos predeterminados. Realiza cualquier actividad de funciones Agregar o eliminar usuarios de bases de datos, grupos y funciones. Agregar, modificar o eliminar objetos Asignar permisos de funciones y objetos Realizar copias de seguridad y restauraciones. Leer datos de cualquier tabla Agregar, cambiar o eliminar datos de las tablas 7 Manual del Alumno db_denydatareader db_denydatawriter No puede leer datos de cualquier tabla No puede cambiar los datos de cualquier tabla. Funciones de bases de datos definidas por el usuario. La creación de una función de base de datos definida por el usuario permite crear un grupo de usuarios con un conjunto de permisos comunes. Agregue una función Cuando un grupo de personas necesite realizar el mismo conjunto de actividades en SQL Server. Si no tiene permisos para administrar las cuentas de usuario de Windows NT Creación de una función de base de datos definida por el usuario: Sintaxis : sp_ addrole función, propietario Ejemplo Exec sp_addrole Managers, dbo Asignación de una cuenta de seguridad a una función de base de datos defiida por el usuario. Sintaxis: sp_addrolemenber función, cuenta de seguridad Exec sp_addrolemenber Manangers, Alicia 3. ASIGNACIÓN DE PERMISOS A USUARIOS Y FUNCIONES 8 Manual del Alumno Después de haber asignado cuentas de inicio de sesión a cuentas de usuario y funciones, debe asignar permisos para exigir la seguridad de la base de datos. Los permisos especifican para qué objetos de la base de datos tienen autorización los usuarios y qué pueden hacer los usuarios con esos objetos. Los permisos que en usuario tiene en una base de datos dependen de los permisos de la cuenta de usuario y de las funciones a las que pertenezca el usuario. Es importante diseñar los permisos que valla a conceder a cada usuario o cada grupo. Todas las bases de datos tienen su propio sistema de permisos independiente. Tipos de permisos Hay tres tipos de permisos en SQL Server de instrucción, de objeto y predefinidos Permisos de instrucción Son los permisos que se le asignan a un usuario cuando se le agrega a un grupo o a una función como una consecuencia de su propiedad sobre un objeto. Por ejemplo, cualquier miembro de la función sysadmin tienen los permisos suficientes como para desarrollar cualquier acción que tenga lugar durante la instalación de SQL Server. Los permisos de instrucción son: CREATE DATABASE CREATE TABLE CREATE VIEW CREATE PROCEDURE CREATE RULE CREATE DEFAULT BACKUP DATABASE BACKUP LOG Permiso de objeto Son los permisos que se aplican a grupos de objetos, tales como por ejemplo tablas o vistas, que permiten que los usuarios interactúen con el objeto. 9 Manual del Alumno Los permisos de objeto son: SELECT TABLE INSERT VIEW DELETE REFERENCES SELECT UPDATE REFERENCES EXEC Permisos predefinidos COLUMN STORED PROCEDURE 10 Manual del Alumno Solo los miembro de funciones fijas o los propietarios de los objetos de bases de datos pueden hacer ciertas actividades. Los permisos que ejecutan dichas actividades se conocen como personas predefinidas o implícitas. Los permisos predefinidos son: Fixed role Object: owner. MODULO 4: ADMINISTRACIÓN DE ARCHIVOS DE BASE DE DATOS 1. INTROIDUCCIÓN A LAS BASES DE DATOS. Al crear una base de datos es importante comprender como SQL Server 7.0 almacena los datos para poder calcular y especificar la cantidad de espacio en disco que hay que asignar a la base de datos. Tenga en cuenta los siguientes hechos y directrices acerca del almacenamiento. Todas las bases de datos tienen un archivo de datos principal (.mdf) y uno o varios archivos de registro de transacciones (.ldf). Una base de datos también puede tener archivos de datos secundarios (.ndf) Cuando se crea una base de datos, se hace una copia de la base model, que incluye las tablas del sistema. El tamaño mínimo de una base de datos debe ser igual o mayor que el tamaño de una base de datos model. Los datos se almacenan en bloques de 8KB de espacio contiguo en disco, llamados páginas. Esto significa que una base de datos puede almacenar 128 páginas por 1 MB. Las filas no pueden abarcar más de una página. Por tanto, la máxima cantidad de datos en una fila, quitando el espacio necesario para la cabecera de la fila es 8060 bytes. Las tablas y los índices se almacenan en exenciones. Una extensión son 8 páginas contiguas o 64 KB. Por tanto, una base de datos tiene 16 extensiones por Megabyte. Las tablas pequeñas pueden compartir extensiones con otros objetos de la base de datos. Los archivos de los registros de transacciones contienen toda la información necesaria para recuperar la base de datos en caso de un error del sistema. De forma predeterminada, el tamaño del registro de transacciones es el 25 por ciento del tamaño de los archivos de datos. Utilice esta proporción como punto de partida y ajústela en función de la necesidades de la aplicación. Como se almacenan los datos: Base de Datos Datos Datos (archivos) (archivos) .mdf o .ndf Registro (archivos) .ldf Extensión (8 espacios Contiguos, páginas de 8 KB) Datos 11 Manual del Alumno Página (8 KB) Tamaño máximo de fila = 8060 bytes. 2. CONFIGURACIÓN DEL SERVIDOR A través de este artículo pretendemos explicar brevemente las opciones de configuración de SQL Server 7. No se trata de ofrecer una explicación exhaustiva de todos los aspectos de la configuración del servidor, sino de un repaso básico para tener una visión global de cuáles son los puntos clave. Si necesitas más información debes consultar los Books On line o Libros en pantallas, que sin duda constituyen la mejor información existente sobre SQL Server. Pantalla principal. La pantalla de configuración es accesible haciendo clic con el botón de la derecha sobre el servidor desde el administrador corporativo (Enterprise Manager) y seleccionando la opción “Propiedades” en el menú contextual. La pantalla principal muestra información general sobre el servidor. Incluyendo la versión de NT y otras informaciones útiles, como la página de códigos del servidor. Las tres opciones de Autoinicio permiten iniciar los servicios de SQL Server de forma automática al arrancar el equipo. Desde esta ventana también podemos acceder a los parámetros de inicio del servidor: 12 Manual del Alumno Los parámetros de inicio son los siguientes: Opciones de inicio Descripción - drutaAccesoArchivo,Master. La ruta de acceso completa del archivo de la base de datos master. - erutaAccesoRegistroErrores. La ruta de acceso completa del archivo de registro de errores. - lrutaAccesoRegistroMaster. La ruta de acceso completa del archivo de registro de la base de datos master. - c Permite no ejecutar SQL Server como un servicio de NT. - f Inicia SQL Server con la configuración mínima. Esto permite reparar un error en la configuración. - m Inicia SQL Server en modo de usuario único. - n No Utiliza el registro de aplicación de Windows NT para registrar sucesos de SQL Server. - pnivelPrecisión Específica el nivel máximo de precisión que van a admitir los tipos de datos decimal y numeric. - sclaveRegistro Permite iniciar SQL Server con datos de configuración almacenados en otra clave de Registry que no sea la clave por defecto. Sólo puede utilizarse desde la línea de comandos. /Ttraza # Indica que SQL Server se debe iniciar con un indicador de traza. -x Deshabilita el mantenimiento de estadísticas. Permite el máximo rendimiento. Memoria A pesar de que lo más recomendable es permitir que SQL Server gestione dinámicamente la memoria, si es necesario un ajuste fino puede realizarse desde esta pantalla: 13 Manual del Alumno Cuando se utiliza la opción de asignación dinámica, SQL Server controla periódicamente la cantidad de memoria que necesita para trabajar y toma memoria del sistema o la suelta según sus necesidades. Sin embargo, deja siempre 5 MB libres para NT, con el objeto de evitar la paginación del código del sistema. Esas 5 MB pueden recuperarse utilizando una asignación fija de memoria. Sin embargo, el propio SQL Server nos advierte de las asignaciones conflictivas: desplazar la asignación de memoria a las zonas amarillas o rojas supone asignar demasiada poca memoria a NT. Si asignamos menos memoria a NT de la que necesita incurriremos en una penalización del rendimiento general. La reserva de memoria física para SQL Server permite bloquear memoria para evitar que Windows NT la asigne a otros procesos si es necesario. Esta configuración puede acelerar el rendimiento de SQL Server, pero puede ir en detrimento de otros procesos del sistema, como el propio NT, y pueden producirse errores de memoria insuficiente. No obstante, si el servidor es un servidor totalmente dedicado a SQL Server y NT dispone de suficiente memoria para sus procesos, esta opción permite acelerar el rendimiento. Procesador Desde esta pantalla se controla el uso de procesadores de SQL Server. Si la máquina dispone de varios procesadores, puede asignarse los procesadores que utilizará SQL Server chequeando la casilla correspondiente. 14 Manual del Alumno La opción máximo de subprocesos secundarios (maximun worker threads) establece el número máximo de subprocesos abiertos por las conexiones a SQL Server. Cada conexión a SQL Server realiza sus operaciones en un subproceso (thread) independiente, lo que puede acelerar considerablemente la ejecución de consultas , sobre todo en equipos con varios procesadores. (SMP). Sin embargo, la creación de subprocesos consume recursos del sistema, no solo por el tiempo necesario para crearlos sino por el aumento en la complejidad de la gestión de esos subprocesos. Si un sistema con un solo procesador llega a tener muchos subprocesos abiertos el rendimiento general bajará bastante. La forma de evitar esa paralización es disminuir el número máximo de subprocesos abiertos. De esta forma, cuando llegue a SQL Server una nueva conexión, si se ha superado el número de subprocesos máximo el sistema esperará a que un subprocesos quede libre y asignará la nueva conexión a ese subproceso. Esto no significa que disminuya el rendimiento, al contrario lo más probable es que algún subproceso se libere muy rápidamente y pueda asignarse con mucha rapidez a la nueva conexión, evitando el gasto de recursos que supone abrir un nuevo subproceso. La opción aumento de prioridad (priority boost) permite cambiar la prioridad de los procesos de NT y SQL Server. Por defecto, los procesos de NT tienen prioridad 7 en un equipo con un solo procesador y 15 en un SMP. Si activamos esta opción, los procesos de NT pasan a tener prioridad 15 y 24 respectivamente. No se aconseja el uso de esta opción en máquinas de un solo procesador. La opción utilizar fibras de Windows NT (Use Windows NT Fibers) permite repartir mejor el trabajo entre varios procesadores. Las fibras y los subprocesos son muy parecidos, salvo en que las fibras están controladas por la aplicación mientras que los subprocesos están controlados por el núcleo del sistema operativo. Las fibras forman parte del sistema de subprocesos, es decir, un subproceso puede tener varias fibras, pero no al revés. El cambio de tareas entre subprocesos es más costoso en recursos que el cambio de tareas entre fibras. Si se utiliza el sistema de fibras en un equipo SMP, SQL Server asigna un subproceso a cada CPU, y a partir de ese momento las conexiones se ejecutan en fibras independientes dentro de cada subproceso. Esto mejora mucho el rendimiento, pero sólo es factible en máquinas con varios procesadores. Las opciones de paralelismo sólo están disponibles en equipos con varios procesadores. El sistema de consultas en paralelo permite procesar consultas complejas con un plan de ejecución en paralelo, es decir, con varios subprocesos atendiendo a la misma consulta. Los ejemplos de consultas que se pueden ejecutar en paralelo son los SubQueries, como por ejemplo este: SELECT orderID, COUNT(*) AS Order_Count FROM orders WHERE orderdate >='1997/04/01' AND orderdate < DATEADO (mm,3,'1997/04/01' AND EXISTS ( SELECT* FROM [order details]. WHERE orders. orderID = [order details]. orderID AND orders. ShippedDATE<orders.RequiredDATE ) GROUP BY orderID ORDER BY orderID 15 Manual del Alumno Mediante esta opción puede determinarse el número de procesadores que SQL Server utilizará en una consulta ejecutada en paralelo. El criterio que SQL Server utiliza para determinar si una consulta ha de ejecutarse en paralelo o no es muy complejo, y puede examinarlo buscando “Grado de paralelismo” en los Books Online. Sin embargo, podemos ajustarlo mediante la opción umbral de costo para paralelismo (cost threshold for parallelism). Cuando más alto sea el umbral más compleja ha de ser una sentencia para que SQL Server se decida a ejecutarla en paralelo, así que podría pensarse que el mejor número es el más bajo. Pero esto no es cierto: Planificar una consulta en paralelo también cuesta un tiempo. Y ese tiempo sólo merece la pena gastarlo cuando la consulta sea realmente compleja. El valor predeterminado es 5, lo que supone un compromiso entre la complejidad de la consulta y el tiempo necesario para planificarla. Seguridad Desde esta pestaña se controlan las opciones de seguridad del servidor. La opción de autentificación establece el tipo de seguridad que utilizará el servidor a la hora de verificar los permisos de acceso. Microsoft recomienda utilizar siempre seguridad integrada (y aún lo recomienda más en el caso de utilizar Windows 2000) de modo que esta opción siempre está disponible. La opción de seguridad propia de SQL Server es la opción por defecto. El nivel de auditoria permite grabar en el Registro de Eventos de NT los sucesos relacionados con la conexión. La cuenta de inicio de servicio es determinante a la hora de ejecutar según qué tareas desde SQL Server. Puede escogerse entre utilizar la cuenta de sistema, que probablemente no tendrá acceso a algunos recursos (impresoras, unidades de red)o utilizar una determinada cuenta. Bajo esa cuenta se ejecutarán todas las tareas que realice SQL Server (incluyendo procedimientos almacenados, paquetes de DTS, etc.) . 16 Manual del Alumno Los procesos planificados el SQL Server Agent se ejecutan bajo una cuenta que se configura separadamente. Conexiones Esta pantalla administra las opciones de conexión El número máximo de conexiones concurrentes permite limitar la cantidad de conexiones simultáneas a SQL Server. Cada conexión requiere aproximadamente 40 kb de modo que utilizar esta opción puede servir para controlar los recursos del sistema. Si se deja a 0, SQL Server permitirá abrir tantas conexiones como admita el hardware, hasta un total de 32.767. Las opciones de conexión se aplican de forma automática a todos los usuarios conectados y son las siguientes: Configuración Descripción Comprobación de restricciones sin efecto en SQL Server 7, se incluye por compatibilidad con SQL Server 6.x Transacciones implícitas. Cuando esta opción está activada, cualquier sentencia inicia una transacción que luego ha de confirmarse explícitamente. No es necesario escribir BEJÍN TRAN, pero si es necesario hacer un COMMIT TRAN para que la sentencia se confirme. Si está desactivado, las transacciones se confirman de forman automática cuando la sentencia se ejecuta correctamente. Cerrar cursos al confirmar Cierra los cursores abiertos de forma automática cuando se ejecuta un COMMIT o un ROLLBACK de una transacción. 17 Manual del Alumno ANSI Warnings Habilita los avisos que se producen en determinadas condiciones de error. ANSI Padding. Esta opción actúa sobre el tratamiento que se le da a los valores varchar y varbirary cuando contienen blancos o cero a la derecha. Si la opción está activada, los valores varchar y varbinary no se truncan si contienen blancos o ceros a la derecha, respectivamente. Si la opción está desactivada, los valores se truncan, y los tipos de datos char y binary, se comportan como si fueran varbinary y varchar. ANSI Nulls Cuando esta opción esta activada, una operación de igualdad entre dos valores nulos devolverá FALSE. Abortar en errores aritméticos Termina una consulta cuando se produce un error de desbordamiento o de división entre cero durante la ejecución de una consulta. Ignorar errores aritméticos Devuelve un valor NULL cuando se produce un error de desbordamiento o de división entre cero durante una consulta. Utilizar identificaciones con comillas Cuando esta opción esta activada, los identificadores y las palabras reservadas en una sentencia SQL pueden ir entrecomillados. NOCOUNT Desactiva el mensaje que se devuelve al final de cada instrucción. Que indica el número de filas afectadas. ANSI NULLS por defecto Cuando esta opción está activada. Las nuevas columnas que se crean en las tablas y aceptarán valores nulos si no se especifica lo contrario. La opción siguiente permite que otros servidores se conecten al servidor local. Esta opción debe estar activada cuando el servidor interviene en replicaciones o cuando se han de ejecutar tareas contra otro servidor. El tiempo máximo de espera en una conexión remota puede establecerse en la remota. La opción Exigir transacciones distribuidas fuerza al servidor a utilizar DTC en transacciones en las que intervengan varios servidores. Opciones de servidor. La siguiente pantalla muestra opciones que se aplican al servidor: 18 Manual del Alumno La opción de lenguaje por defecto establece el formato de mensajes, nombres de meses, días de la semana, fechas y otras características relativas a la localización. El lenguaje se establece para cada login y puede cambiarse si se desea. La opción de permitir modificaciones en las tablas de catálogos es muy útil y permite realizar cambios en las tablas de la base de datos master lanzando sentencias SQL contra ellas Microsoft desaconseja este método, pero en alguna ocasión puede ser útil para reparar algún accidente. La opción de triggers anidados permite que un trigger que se desencadena en una tabla lance a su vez otro trigger de otra tabla. El nivel máximo de anidación es de 16 triggers. El límite de costo del regulador de consultas es una opción muy útil que permite establecer el tiempo máximo en segundos que puede durar una consultar para que el regulador la lance. Esto permite evitar la ejecución accidental de consultas salvajes que tardarían mucho tiempo en ejecutarse. Si se desactiva se lanzarán todas las consultas, sea cual sea su coste. La opción de correo permite especificar que perfil de usuario utilizará SQL Server para los mensajes enviados mediante el servicio SQL Mail. El soporte de año 2000 permite crear una “ventana” de 100 años para interpretar las fechas que llegan al sistema con dos dígitos. Esta opción para el año. SQL Server utiliza cuatro dígitos para el año en todos los campos de tipo fecha. También sirve para interpretar la fecha cuando el usuario sólo envía dos dígitos de año al servidor. Opciones de bases de datos. La última pantalla gestiona opciones generales para las bases de datos. 19 Manual del Alumno La opción de llenado de índices permite establecer el porcentaje de utilización de las páginas de índices cuando el sistema reconstruye los mismos. Por lo general lo más aconsejable es utilizar la personalización del factor de llenado en cada índice, a menos que todas las tablas de todas las bases de datos se utilicen de la misma manera. Ya que el factor de llenado de los índices depende de la utilización de las tablas a las que hacen referencia. Las opciones de copia de seguridad establece los tiempos de respuesta cuando SQL Server recupera una base de datos de un dispositivo de copia de seguridad. Por último, la opción de tiempo de espera para recuperación determina cuanto tiempo estará SQL Server intentando recuperar una base de datos al arrancar el servicio antes de dar un error de “base de datos no recuperada”. Eso es todo. Todas estas opciones están ampliamente documentadas en los libros en pantalla, así que os recomendamos que los consultéis antes de decidiros a cambiar cualquier aspecto. 3. CREACIÓN DE BASE DE DATOS CREATE DATABASE library ON PRIMARY (NAME = library_data, FILENAME =`C: \mssql7\data\library.ldf`, SIZE = 10 MB, MAXSIZE = 5 MB FILEGROWTH = 20 %) LOG ON (NAME = library_log, FILENAME =`C: \mssql7\data\library.ldf`, SIZE = 3 MB, MAXSIZE = 5 MB FILEGROWTH = 1 MB) Puede crear una base de datos con el asistente para crear base de datos, el administrador corporativo de SQL Server o la instrucción CREATE DATABASE. El proceso de creación de una base de datos crea también un registro de transacciones para la base de datos. La información acerca de la base de datos de SQL Server está almacenada en la tabla sysdatabases de la base de datos master . Por tanto, debe utilizar la base de datos master para crear una base de datos cuando utilice instrucciones Transact – SQL. Importante: debe de hacer una copia de seguridad de la base de datos master cada vez que cree, modifique o elimine una base de datos. 20 Manual del Alumno Este es el asistente para crear bases de datos dentro del Enterprise Manager. Al crear una base de datos se pueden establecer las siguientes opciones: PRIMARY: Esta opción especifica los archivos del grupo de archivos principal. El grupo de archivos principal contiene todas las tablas del sistema de la base de dato. También contiene todos los objetos no asignados a grupos de archivos del usuario. Una base de datos solo puede tener un archivo principal. FILENAME: Esta opción especifica el nombre del archivo del sistema operativo y la ruta de acceso al archivo. SIZE: Esta opción especifica el tamaño de los archivos de datos o registro. MAXSIZE: Esta opción especifica el tamaño máximo hasta el que puede crecer el archivo. Puede especificar el tamaño en MB o en KB . Si no especifica el tamaño el archivo crece hasta que el disco esta lleno. 4. MODIFICAR BASE DE DATOS según se vaya trabajando con SQL Server descubrirá que, con el transcurso del tiempo, tendrá que modificar los parámetros para mejorar su eficacia. SQL Server le permite agregar archivos o registro de transacciones a la base de datos siempre que lo necesite. Hay muchas opciones que se pueden personalizar llegado el caso. Ampliación de Base de Datos Para ampliar una base de datos utilizando el Enterprise Manager de SQL, haga clic con el botón derecho del ratón en la base de datos deseada que se encuenta en la ventana Server Manager y seleccione Propiedades.( Administrador Corporativo). 21 Manual del Alumno - Creación y manejo de tablas Consultas con SQLPlus Pantallas de ingreso con SQLForms Programación en PL/SQL Informes con SQLReport Diseño de menú con SQLMenu Ajustándonos a esta lógica, el tema central de este artículo y punto de partida en cualquier curso de Oracle será el diseño y creación de tablas. Creación de tablas Como expusimos en nuestro artículo anterior, en Oracle cada estructura de información se denomina TABLA las cuales, junto a los índices y al diccionario de datos del sistema, componen la base de datos. Por lo tanto, la creación de las tablas en el proceso de programación en Oracle juegan un papel muy importante. En el momento de crear las tablas se definen características a dos niveles: Tabla y Columna, como se muestra a continuación: A nivel de Tabla Nombre: Nombre de la tabla puede ser de 1 a 30 caracteres. Propietario: La tabla tiene como propietario al usuario que las crea En nuestro caso somos el usuario EIDOS. Otro usuario que desee usar nuestras tablas debe tener autorización para ello y hacer referencia a la tabla como eidos.clientes (propietario.tabla) Cantidad de Columnas: Una tabla puede tener un máximo de 254 columnas. A nivel de Columna Nombre: Puede tener de 1 a 30 caracteres. Tipo de dato y su ancho CHAR Máximo de 255. Por defecto 1. NUMBER Máximo de 105 dígitos. Por defecto 44. INTEGER Numérico sin decimal. Por defecto 38. DATE Hasta el 31 de diciembre de 4712. LONG Tipo caracter con tamaño variable hasta 65535 bytes. Permite una sola columna LONG por tabla. No se puede usar en subconsultas, funciones o índices. RAW Dato en binario puro (imágenes y sonido) con un ancho máximo de 255. LONGRAW Igual que LONG, pero para almacenar datos en binario puro. Restricciones: Su función es definir reglas de validación de la columna. Para facilitar la continuidad del análisis, usaremos como ejemplo las tablas definidas en el artículo anterior: Clientes y VENTAS. La definición de restricciones al crear las tablas permite establecer reglas de validación de datos, así como los controles necesarios para mantener la integridad referencial entre tablas a través de las columnas claves. Las restricciones que se pueden definir son: Valor obligatorio: En Oracle existe el concepto de valor nulo (NULL), como un valor indefinido o ausencia de valor y que es diferente al numero 0 o al carácter espacio. Por 22 Manual del Alumno lo tanto, para que una columna siempre tenga valor (sea obligatoria) se define como NOT NULL. Rango de valores: Sirven para chequear que el valor sea mayor a un valor determinado o para que se encuentre entre dos valores. Clave Primaria: Columnas que identifican de forma única al registro, es un valor único y no nulo (NOT NULL). Por ejemplo: el código del cliente es una clave primaria que identifica de forma única e irrepetible a cada cliente. Clave Externa: Columna de la tabla que hace referencia a un valor que tiene que estar registrado en otra tabla. Por ejemplo: la columna código de la tabla VENTAS es una clave externa que hace referencia a un valor de la columna código (clave primaria) de la tabla Clientes. En la versión 6 de Oracle (que dado lo reciente de la versión 7 aún se usa ampliamente) la única restricción que estaba activa era la de valor obligatorio (NOT NULL), siendo las otras restricciones sólo declarativas, o sea, que quedaban registradas en la definición de la tabla, pero no se podían activar. En la versión 6, para garantizar la unicidad de la clave primaria, era necesario crear índices con claves únicas, aspecto éste que retomaremos más adelante. En la versión 7 de Oracle estas restricciones están implementadas, garantizándose la verificación y correción de datos en cualquier momento sin tener que programar estos controles. Destacadas estas cuestiones veamos, entonces cómo se procede para crear las tablas Clientes y Ventas. Tabla Clientes Objetivo: Ficha con datos para identificar al cliente. Consta del código del cliente (número secuencial), fecha de alta al sistema, nombre, teléfono, dirección y alguna anotación. Requisitos: Se debe identificar a cada cliente con un código único (clave primaria), registrando su nombre, teléfono y fecha de registro (estos datos son obligatorios). La dirección y anotaciones son campos opcionales. Creación de la tabla: Ver el fuente 1 Fuente 1 CREATE TABLE clientes ( codigo integer NOT NULL PRIMARY KEY, fecha date NOT NULL, nombre char(30) NOT NULL, telefono char(20) NOT NULL, direccion char(100), anotacion LONG ); Tabla Ventas Objetivo: Registrar las ventas con al siguiente información: Código del cliente, fecha de la venta, artículo y valor de la venta. 23 Manual del Alumno Requisitos: El número del cliente es una clave externa que hace referencia a la columna codigo en la tabla Clientes. En este caso, todos los datos son obligatorios. Se controla que la columna valor sea mayor a cero. Creación de la tabla: ver fuente 2 Fuente 2 CREATE TABLE ventas ( codigo INTEGER NOT NULL REFERENCES clientes(codigo), fecha DATE NOT NULL, articulo CHAR(20) NOT NULL, valor NUMBER(10,2) NOT NULL CHECK (valor>0) ); Las restricciones de Claves Primaria y Clave Externa se definieron a nivel de columna, pero se pueden definir a nivel de tabla, al final de la misma, como se muestra en el fuente 3: Fuente 3 CREATE TABLE clientes (codigo INTEGER nombre CHAR(30) direccion CHAR(100), anotacion LONG, PRIMARY KEY (codigo)); NOT NULL, NOT NULL, CREATE TABLE ventas (codigo INTEGER NOT NULL, fecha DATE NOT NULL, articulo CHAR(10), valor NUMBER(6,2) NOT NULL CHECK (valor>0), FOREIGN KEY (codigo) REFERENCES clientes(codigo)); La definición de la clave a nivel de tabla es necesaria cuando la misma está formada por más de una columna. Unicidad de la clave con índices Para garantizar la unicidad de los valores de la clave primaria de la tabla Clientes (en la versión 6 donde esta restricción sólo es declarativa y no está activa), se debe crear un índice que garantice la unicidad de la clave principal. Un requisito importante para la unicidad de la clave principal es que las columnas de la clave se definen como NOT NULL. A continuación mostraremos cómo crear el índice cliente_codigo para garantizar la unicidad de la clave primaria: CREATE UNIQUE INDEX cliente_codigo ON clientes(código); 24 Manual del Alumno Secuencias: codificación numérica La codificación numérica del cliente se puede realizar con una secuencia que automáticamente genera los números enteros en orden ascendente, no siendo necesario recordar cuál fue el último número asignado ; esto evita la duplicidad de códigos. La secuencia es un objeto que genera valores enteros únicos y se emplean para crear claves primarias numéricas, con el uso del siguiente mandato: CREATE SEQUENCE codigo_cliente INCREMENT BY 1 START WITH 1; Para registrar un nuevo código con la secuencia definida anteriormente se usa la pseudo-columna codigo_cliente.NEXTVAL, la cual nos dará el siguiente valor que le corresponde a la secuencia, la forma en que esto se realiza se explicará más adelante, cuando analicemos el ingreso de datos. Para conocer el valor actual de la secuencia, o sea, el último código asignado, se usa la pseudocolumna codigo_cliente.CURRVAL, desde la tabla DUAL del sistema, cuyo fin es poder consultar pseudo_columnas (como se muestra a continuación): SELECT user,sysdate,codigo_cliente.currval FROM DUAL; donde: 1.2.3.- user es el nombre del usuario sysdate es la fecha del sistema codigo_cliente.currval es el último valor asignado a la secuencia. Ingreso de datos Una vez creadas las tablas, índices y secuencias, estamos en condiciones de ingresar datos en la tabla. El ingreso, modificación y eliminación de registros se realiza fundamentalmente con el diseño de pantallas (formularios) desde el módulo SQLFORMS (que será tema de análisis específico en otro artículo). No obstante, en este artículo veremos el uso de los mandatos INSERT UPDATE y DELETE. Para ingresar un nuevo registro debemos ensayar lo que se muestra en la tabla 1: Nombre de la Tabla (acciones) Columnas 25 Manual del Alumno INSERT INTO CLIENTES VALUES( codigo_cliente.NEXTVAL, 'PINTURERIAS PROPIOS', '45 67 89' TO_DATE('10/04/95','DD/MM/YY'), 'Uruguay 1234', 'LIBRERIA' ); codigo= secuencia nombre teléfono fecha dirección anotación Tabla1: Inserción de nuevos registros Como se podrá observar, en este ejemplo no se especificó la lista de columnas a insertar, lo que indica que se van a ingresar datos para todas las columnas. Por lo tanto, los valores para cada columna se tienen que ingresar en el orden en que están definidos en la tabla. Además, es de destacar que la palabra reservada VALUES indica la lista de valores a ingresar; que los datos tipo carácter van entre comillas; que la fecha se registra como una cadena de caracteres usando la función TO_DATE (encargada de transformar la cadena de caracteres '10/04/95' en fecha, a partir de un formato de fecha especificado -'DD/MM/YY'-). También observamos que a la columna codigo se le asignó el siguiente valor de la secuencia codigo_cliente (codigo_cliente.NEXTVAL). En caso de que sólo se asignaran valores a algunas columnas se debe dar la lista de columnas como se muestra en el fuente 4 correspondiente a la lista de columnas. Fuente 4 INSERT INTO CLIENTES (codigo,nombre,teléfono,fecha) VALUES (codigo_cliente.NEXTVAL,'CASA AUGE DEPORTES', '598768',TO_DATE('15/04/95','DD/MM/YY')); Las columnas a las que se les ingresa información se listan después del nombre de la tabla, en el orden deseado. Las columnas no listadas tendrán valor NULL, por ello todas las columnas definidas como obligatorias (NOT NULL) deben estar en la lista. Los siguientes ejemplos muestran posibles errores y sus correspondientes mensajes en el registro de datos: 1.- Falta dato del teléfono que es obligatorio: INSERT INTO CLIENTES(codigo,nombre) VALUES (codigo_cliente.NEXTVAL, 'EMPRESA D' ); Mensaje de error: ORA-01400: mandatory (NOT NULL) column is missing or NULL during insert. 2.- Intento de registrar cliente con código ya existente: 26 Manual del Alumno INSERT INTO CLIENTES(codigo,nombre,teléfono) VALUES (1,'EMPRESA TTT','341234'); Mensaje de error: ORA-00001: duplicate key in index Obsérvese en el caso 2 que la secuencia codigo_cliente no fue usada al ingresar el valor del código, y sí en el caso 1, provocando error de duplicidad de código. Esto ocurre porque la creación de la secuencia no garantiza la unicidad del código, ya que podemos registrar un código de cliente sin su uso. Sin embargo, la unicidad esta garantizada por la definición del índice único visto anteriormente. Si siempre se usa la secuencia la unicidad por supuesto que está garantizada, pero la simple definición de la secuencia no es garantía de su uso. Listados de registros A continuación veremos cómo obtener listados para revisar la información registrada, para lo cual seleccionaremos (select) registros desde (from) una tabla. En realidad el mandato SELECT será tema de análisis más detallado en la próxima entrega, por lo que ahora sólo lo trataremos con el objetivo de visualizar los datos ingresados. Para obtener un listado de todas las columnas y todos los registros de la tabla Clientes debemos seguir este procedimiento: Nombre de la Tabla SELECT * FROM clientes; Donde * = Todas las columnas El resultado es el que se muestra en la tabla 2: Código Fecha Nombre 1 10-Apr-95 Pinturerías propios 2 15-Apr-95 Casa Auge deportes 3 20-Apr-95 Feria del libro 4 30-Apr-95 Club de tenis Tabla 2: Datos de la tabla Clientes Teléfono 45 67 89 598768 (0567)845677 905877 Dirección Uruguay 1234 Para listar sólo algunas columnas de la tabla clientes el procedimiento a seguir es: SELECT codigo,nombre FROM clientes; El resultado es el que se muestra en la tabla 3: Anotación Ferretería 27 Manual del Alumno Código Nombre 1 Pinturerías propios 2 Casa Auge deportes 3 Feria del libro 4 Club de tenis Tabla 3: Datos de la tabla Clientes para Codigo y Nombre Modificación de registros. Para modificar valores de la tabla usaremos el mandato UPDATE, con el objetivo de modificar el teléfono y la dirección del cliente Feria del libro. Para ello, basta con definir: UPDATE clientes SET telefono='234567', direccion='Andes 945' WHERE nombre='Feria del libro'; donde: Clientes es el nombre de la tabla SET es para indicar el inicio de la lista de columnas y sus nuevos valores. WHERE garantiza la selección de la fila del cliente. Es importante destacar que si no se usa la cláusula WHERE, se modificará el valor de la columna en todas las filas de la tabla. Eliminación de registros La eliminación de registros se realiza con el mandato DELETE. El siguiente ejemplo eliminará los clientes con el código cero: DELETE FROM clientes WHERE codigo=0; En este caso, si se omite la cláusula WHERE serán eliminados todos los registros de la tabla. SQLPlus Todas las tareas anteriormente estudiadas se realizan con el módulo SQLPlus de Oracle, que trabaja en forma interactiva. A continuación enunciaremos los pasos necesarios para usar SQLPLUS y poder crear tablas, índices o secuencias, así como insertar datos y obtener listados: 1.- Llamar al programa SQLPLUS 2.- Identificación del usuario Enter user-name: EIDOS 28 Manual del Alumno Enter password: Si la identificación es correcta se obtiene mensaje de: Connected to: ORACLE Si, por el contrario, la identificación es incorrecta se recibe el siguiente mensaje: ERROR: ORA-01017: invalid username/password; logon denied 3.- Indicador en pantalla de que SQLPlus está a la espera de la orden: SQL>_ 4.- Escribir los mandatos de creación de tablas, índices y secuencia en un archivo (TABLAS.SQL) con el uso del editor. SQL>edit tablas 5.- Ejecutar los mandatos escritos en el archivo TABLAS.SQL SQL>@tablas 6.- Para salir de SQLPlus SQL>exit Otras tareas A continuación examinaremos una serie de mandatos, a nivel de definición de las tablas, gracias a los cuales se puede: 1.2.3.4.5.6.7.- Listar estructuras de las tablas (DESCRIBE) Modificar la estructura de las tablas (ALTER TABLE) Renombrar las tablas (RENAME) Eliminar una tabla (DROP TABLE) Eliminar un indice (DROP INDEX) Consultar las tablas del diccionario Listado de tablas, Índices y secuencias propiedad del usuario. Detengámonos en los detalles más significativos de cada una de dichas tareas: 1.- Listar estructura de las tablas (DESCRIBE) Para obtener la estructura (descripción de una tabla) el mandato que se debe emplear es: SQL>DESCRIBE clientes; con lo que el resultado será el que se ofrece en la tabla 4. Name NUMERO FECHA NOMBRE TELEFONO DIRECCION Null? NOT NULL NOT NULL NOT NULL NOT NULL Type NUMBER(38) DATE CHAR(30) CHAR(20) CHAR(100) 29 Manual del Alumno ANOTACION LONG Tabla 4: Resultado del uso del mandato DESCRIBE 2.- Modificar la estructura de las tablas (ALTER TABLE) La modificación de la estructura de las tablas con el uso de ALTER permite: - Añadir nuevas columnas. Añadir restricciones a una columna, en este caso la tabla no debe contener datos. Modificar el ancho de la columna. Modificar el tipo de datos de la columna sólo si la columna no contiene datos o está vacía. Modificar al tipo LONG sólo una columna sin restricciones. El siguiente ejemplo muestra cómo añadir, en la tabla Ventas, las columnas Factura (para registrar el número de factura) y Cobro (tipo carácter con 2 posibles valores, N=NO cobrada, NULL=cobrada) y modificar la columna valor para ampliar su ancho. ALTER TABLE ventas ADD ( factura integer, cobro char ) MODIFY ( valor number(10,2) ); 3.- Renombrar las tablas (RENAME) Para cambiar el nombre de la tabla Clientes a EMPRESAS se usa el siguiente mandato: SQL>RENAME clientes TO empresas; 4.- Eliminar una tabla (DROP TABLE) Le eliminación de la tabla es como sigue: SQL>DROP TABLE clientes; En este caso se eliminan, también, todos los índices de la tabla. 5.- Eliminar un índice (DROP INDEX) SQL>DROP INDEX cliente_codigo; 6.- Consultar las tablas del diccionario. Toda la información de las tablas está registrada en el diccionario del sistema (Data Dictionary), que son tablas especiales que se crean en la instalación de ORACLE (que son administradas por el sistema). Para consultar la lista de tablas que componen el diccionario se escribe: 30 Manual del Alumno SQL>HELP DATA DICT Gracias a lo cual se muestra una lista con la información de la tabla 5: Nombre de la tabla ACCESSIBLE_COLUMNS ACCESSIBLE_TABLES AUDIT_ACTIONS ALL_INDEXES ALL_SEQUENCES ALL_TABLES ..... USER_TABLES USER_TAB_COLUMNS USER_TAB_GRANTS Descripción columns of all tables, views, and clusters tables and views accessible to the user maps action type numbers to action type names descriptions of indexes on accessible descriptions of the user's own sequences description of tables accessible to the user descriptions of the user's own tables columns of the user's tables, views, and clusters grants on objects where the user is the owner, grantor, or grantee Tabla 5: Consulta de las tablas que componen el diccionario También podemos ver la estructura de una tabla del diccionario como se muestra a continuación: SQL>DESCRIBE ALL_TABLES; SQL>DESCRIBE all_indexes; SQL>DESCRIBE all_sequences; 7.- Listar las tablas, índices y secuencias definidas por un usuario Para las tablas: SQL>SELECT TABLE_NAME "TABLA" FROM ALL_TABLES WHERE OWNER='EIDOS'; Resultado: Clientes y Ventas Para los índices: SQL>SELECT table_name,index_name FROM all_indexes WHERE owner='EIDOS'; Resultado: Clientes (con índice Cliente_Nombre y Cliente_Numero) y Ventas (con índice Venta_Numero) Para las secuencias: 31 Manual del Alumno SQL>SELECT sequence_name FROM all_sequences WHERE sequence_owner='EIDOS'; Resultado: el nombre de la secuencia usada (SEQUENCE_NAME) Codigo_Cliente Sentencia SELECT Como ya sabemos, la herramienta fundamental de SQL es la sentencia SELECT, que permite seleccionar registros desde las tablas de la Base de Datos, devolviendo aquellos que cumplan las condiciones establecidas y pudiendo presentar el resultado en el orden deseado. Primeramente estudiaremos la forma básica de la sentencia SELECT, que esta formado por: SELECT FROM WHERE Lista... Tabla, Tabla... Condiciones... ORDER BY Expresión,Expresión,... ; Fin de la sentencia. Donde: La orden SELECT puede contener: - Columnas: nombre, telefono Expresiones y funciones: SYSDATE-fecha,UPPER(direccion) Pseudo-Columnas del Sistema: SYSDATE,USER. Asterisco: Todas las columnas. La orden FROM identifica la lista de tablas a consultar. Si alguna de las tablas a consultar no es propiedad del usuario, debe especificarse el nombre del propietario antes que el nombre de la tabla en la forma nombre_propietario.nombre_tabla. La orden WHERE decide los registros a seleccionar según las condiciones establecidas, limitando el número de registros que se muestran. La orden ORDER BY indica el orden en que aparece el resultado de la consulta. Ilustremos lo explicado hasta el momento con el ejemplo del fuente 1, donde consultaremos las ventas realizadas en los últimos 10 días, mostrando el nombre del cliente, artículo vendido y su valor. Fuente 1 SELECT nombre,articulo,valor FROM Lista nombre del cliente, nombre del artículo y el valor de la venta. clientes,ventas Tablas con la información de clientes y ventas. WHERE clientes.codigo=ventas.codigo Establece la relación, según código de cliente, entre las tablas clientes y ventas. and sysdate-ventas.fecha>=10 32 Manual del Alumno ORDER BY nombre ; Consulta las ventas de los últimos 10 días. Ordenar el listado por nombre del cliente. Fin de la sentencia. El resultado de esta sentencia SELECT sería el de la tabla 1: NOMBRE ARTICULO VALOR CASA AUGE DEPORTES PAPEL 330.0 CASA AUGE DEPORTES DISKETTE 33.0 CLUB DE TENNIS PAPEL 500.5 ... CLUB DE TENNIS PAPEL 100.5 FERIA DEL LIBRO PAPEL 310.0 PINTURERIAS PROPIOS PAPEL 220.5 PINTURERIAS PROPIOS DISKETTE 20.5 Tabla 1: Resultados de la sentencia SELECT del fuente 1 Obsérvese que las columnas que tienen el mismo nombre en ambas tablas se diferencian escribiendo el nombre de la tabla antes que el nombre de la columna, como en el caso de ventas.fecha, ventas.codigo y clientes.codigo. Operadores lógicos Para construir la condición de la consulta necesitamos conocer los operadores lógicos, por eso a continuación damos una lista de los operadores más usados, agrupados en cuatro grupos: 1. 2. 3. 4. Valor único:Comprueban un valor simple. Lista de valores:Comprueban más de un valor. Combinaciones lógicas:Combinan expresiones lógicas. Negación:Invierte el resultado de la expresión con operadores de valor único o de lista de valores. Valor único > < >= <= = Operadores clásicos de comparación: mayor, menor, mayor e igual, menor e igual, igual a. != <> ^= Operador "Distinto de" en sus tres formas. IS NULL Comprueba la ausencia de datos (valor nulo). No se puede usar la comparación = NULL. LIKE 33 Manual del Alumno Selecciona registros según el reconocimiento de un patrón de consulta. Lista de valores BETWEEN valor AND valor Comprueba que el valor se encuentre en el rango de valores. IN (valor,...,valor) Verifica si el valor pertenece a la lista de valores. Combinaciones lógicas. AND Retorna Verdadero si todas las condiciones son verdaderas. OR Retorna Verdadero si alguna de las condiciones es verdadera. Negación NOT Invierte el resultado de una expresión lógica, por ejemplo. IS NOT NULL NOT BETWEEN valor AND valor NOT IN (valor,...,valor) NOT LIKE A continuación mostramos algunas consultas con el uso de diferentes operadores lógicos: - Clientes a los que no se les ha registrado su dirección. SELECT nombre,telefono 34 Manual del Alumno FROM clientes WHERE direccion IS NULL; - Clientes dados de alta en los últimos 10 días. SELECT nombre,direccion,telefono FROM clientes WHERE fecha BETWEEN sysdate-10 AND sysdate; - Datos de los Clientes que pertenecen a una lista de clientes. SELECT nombre,direccion,telefono FROM clientes WHERE nombre IN ('PINTURAS','CASA DE DEPORTES') ; - Clientes dados de altas en lo que va del mes y cuyo nombre comience con la letra P u otra letra mayor o su teléfono contenga el código (0567). Ver fuente 2 Fuente 2 SELECT nombre,direccion,telefono,fecha FROM clientes WHERE fecha BETWEEN to_date('01/'||to_char(sysdate,'MM/YY'),'DD/MM/YY') AND sysdate AND (nombre >= 'P' OR telefono LIKE '%(0567)%'); El manejo de fecha es una de las capacidades de mayor variedad e interés en ORACLE por las posibilidades que presenta en el almacenamiento, cálculo y presentación de fechas. Por eso, en el último ejemplo damos un vistazo a algunas funciones útiles en el uso de fechas como son: to_char(sysdate,'MM/YY') Devuelve una cadena de caracteres de la forma mes/año de la fecha actual. '01/'||to_char(sysdate,'MM/YY') Forma la cadena de caracteres 01/mes/año que representa el primer día del mes. El operador || se usa para unir o concatenar cadenas de caracteres. 35 Manual del Alumno ... to_date('01/'||to_char(sysdate, 'MM/YY' ), 'DD/MM/YY') ... Convierte la cadena de caracteres 01/mes/año al tipo fecha. Patrón de consulta Una de las herramientas lógicas más poderosas de SQL es el reconocimiento de un patrón de consulta, instrumento éste que permite la búsqueda por nombre, dirección u otro dato parcialmente recordado. Los patrones de consulta juegan un papel importante en el momento de realizar consultas, ya que es común que necesitemos encontrar un texto y no recordemos exactamente cómo fue ingresado. Con el uso del operador LIKE podemos comparar patrones y ubicar un texto, independientemente de la posición en que se encuentre. Para la definición del patrón de consulta existen dos tipos de caracteres especiales: % (signo de porcentaje) llamado comodín, representa cualquier cantidad de espacios o caracteres en esa posición. Significa que se admite cualquier cosa en su lugar: un caracter, cien caracteres o ningún caracter. _ (signo de subrayado) llamado marcador de posición, representa exactamente una posición e indica que puede existir cualquier caracter en esa posición. En los fuentes 3, 4 y 5 detallamos tres ejemplos de consulta con el Operador LIKE: Listar los clientes cuya dirección contengan la palabra URUGUAY independientemente de su ubicación: Fuente 3 SELECT nombre,direccion,telefono FROM clientes WHERE direccion LIKE '%URUGUAY%'; Listar los clientes cuyos teléfonos tienen comienzan con el código de área el 0722 SELECT nombre,direccion,telefono FROM clientes WHERE telefono LIKE '(0722)%'; Listar los clientes cuyo nombre terminan con la palabra LIBRO: Fuente 4 SELECT nombre,direccion,telefono FROM clientes WHERE nombre LIKE '%LIBRO'; 36 Manual del Alumno Listar los clientes que tengan la palabra LIBRO a partir de la 5ª posición en el nombre. Fuente 5 SELECT nombre,direccion,telefono FROM clientes WHERE nombre LIKE '____LIBRO%'; Agrupamiento de datos SQL proporciona una forma eficiente para manejar la información con el agrupamiento de datos a través de la formación de grupos y las funciones correspondientes, dando la posibilidad de procesar no solo registros individuales como hemos hecho hasta ahora. También podemos agrupar registros por un criterio determinado, como por ejemplo, agrupar por clientes las ventas realizadas. Cada grupo tendrá como resultado de la consulta una fila resumen que contiene la información del grupo. Para la formación de grupos adicionamos, a la forma básica de la sentencia SELECT vista anteriormente, la orden GROUP BY ubicada antes de ORDER BY, como se muestra a continuación: SELECT FROM WHERE GROUP BY ; Lista... Tabla, Tabla... Condiciones Expresión, Expresión,... ORDER BY Expresión, Expresión,... Terminador Las funciones para el procesamiento de grupos son: COUNT(columna) Cantidad de registros en que la columna tiene valores no nulos. COUNT(*) Cantidad de registros que hay en la tabla, incluyendo los valores nulos. MIN(columna) Valor mínimo del grupo. MAX(columna) Valor máximo del grupo. SUM(columna) Suma los valores del grupo. AVG(columna) Calcula valor medio del grupo, sin considerar los valores nulos. La lista de columnas a mostrar en la consulta puede contener las funciones de grupo, así como la columna o expresión usada para formar los grupos en la orden GROUP BY. En una misma consulta no se pueden mezclar funciones de grupo con columnas o funciones que trabajan con registros individuales. Las ventas por cliente es un buen ejemplo para mostrar el uso de los grupos. En el siguiente caso se hace un resumen de ventas por cliente, con la cantidad de ventas, valor mínimo, medio 37 Manual del Alumno y máximo, así como la suma total de ventas. La formación del grupo será por el nombre del cliente y la columna a cuantificar para cada grupo será el valor de las ventas. SELECT nombre "CLIENTE", COUNT(valor) "VENTAS", MIN(valor) "MINIMA", AVG(valor) "MEDIA", MAX(valor) "MAXIMA", SUM(VALOR) "TOTAL" FROM clientes,ventas WHERE clientes.codigo=ventas.codigo GROUP BY nombre ; CLIENTE VENTAS MINIMA CASA AUGE DEPORTES 3 33.0 CLUB DE TENNIS 3 100.5 FERIA DEL LIBRO 3 110.0 PINTURERIAS PROPIOS 3 20.5 Tabla 2: Estadística de la base de datos MEDIA 138.667 237.167 203.333 90.500 MAXIMA 330.0 500.5 310.0 220.5 TOTAL 416.0 711.5 610.0 271.5 Como se puede observar en la tabla 2, a cada columna se le asignó un título de cabecera, que se escribe entre comillas dobles a la derecha de la columna, con el objetivo de mejorar la presentación de la consulta. El orden en las consultas por grupos, cuando no esta presente la orden ORDER BY, está dado por la columna que forma los grupos. Si deseamos cambiar ese orden, como es el caso de ordenar por el valor total de ventas, se debe adicionar al final la orden ORDER BY SUM(VALOR). En el ejemplo del fuente 6 se forman grupos por artículo para obtener la cantidad de ventas, valor mínimo, medio y máximo, así como la suma total de ventas para cada artículo, ordenado de mayor a menor por la venta total. Fuente 6 SELECT articulo, COUNT(valor) "VENTAS",MIN(valor) "MINIMA", AVG(valor) "MEDIA",MAX(valor) "MAXIMA",SUM(VALOR) "TOTAL" FROM ventas GROUP BY articulo ORDER BY SUM(valor) DESC ; ARTICULO VENTAS MINIMA MEDIA MAXIMA PAPEL 8 100.5 234.00 500.5 DISKETTE 4 20.5 34.25 53.0 Tabla 3: Otra estadística de la base de datos Subconsultas TOTAL 1872 137 38 Manual del Alumno Otro aspecto de fácil diseño y uso que muestra una vez más las posibilidades de SQL son las subconsultas. Subconsulta es aquella consulta de cuyo resultado depende otra consulta, llamada principal, y se define como una sentencia SELECT que esta incluida en la orden WHERE de la consulta principal. Una subconsulta, a su vez, puede contener otra subconsulta y así hasta un máximo de 16 niveles. Las particularidades de las subconsultas son: 1. Su resultado no se visualiza, sino que se pasa a la consulta principal para su comprobación. 2. Puede devolver un valor único o una lista de valores y en dependencia de esto se debe usar el operador del tipo correspondiente. 3. No puede usar el operador BETWEEN, ni contener la orden ORDER BY. 4. Puede contener una sola columna, que es lo más común, o varias columnas. Este último caso se llama subconsulta con columnas múltiples. Cuando dos o más columnas serán comprobadas al mismo tiempo, deben encerrarse entre paréntesis. Expliquemos como se construye una subconsulta con el siguiente ejemplo, donde necesitamos saber ¿cuál fue la mayor venta realizada?. Para ello, diseñemos una subconsulta que busque el valor máximo de venta con el uso de la función MAX(valor) y una consulta principal que muestre las ventas iguales al máximo valor encontrado por la subconsulta. Veamos el fuente 7. Fuente 7 SELECT nombre,articulo,valor FROM clientes,ventas WHERE valor = ( Subconsulta para buscar SELECT MAX(valor) el valor máximo de venta. FROM ventas ) AND clientes.codigo=ventas.codigo ; NOMBRE: ARTICULO: VALOR: CLUB DE TENNIS PAPEL 500.5 Otra aplicación clásica de la subconsulta es cuando deseamos saber las ventas de un artículo realizadas por encima de su venta promedio. En este caso, es necesario realizar los pasos mostrados en el fuente 8: Fuente 8 SELECT nombre,valor "PAPEL" FROM clientes,ventas WHERE clientes.codigo=ventas.codigo AND articulo='PAPEL' AND valor > ( SELECT AVG(valor) Subconsulta de venta promedio de 39 Manual del Alumno FROM ventas WHERE articulo='PAPEL' papel. ) ORDER BY valor DESC ; Ordenado por valor de venta en forma descendente NOMBRE PAPEL CLUB DE TENNIS 500.5 CASA AUGE DEPORTES 330.0 FERIA DEL LIBRO 310.0 Tabla 4: ventas por encima de su venta promedio Grupos con subconsulta Hasta el momento estudiamos por separado un conjunto de herramientas de SQL, viendo en cada caso sus posibilidades. Ahora pasaremos a ver la combinación de grupos y subconsultas, lo que multiplica las posibilidades de SQL en cuanto al rendimiento en el diseño de consultas complejas se refiere, las cuales se pueden realizar en forma sencilla y con pocas líneas de código. Para combinar grupos con subconsulta debemos incluir en la sentencia SELECT la orden HAVING, que tiene las siguientes características: 1. Funciona como la orden WHERE, pero sobre los resultados de las funciones de grupo, en oposición a las columnas o funciones para registros individuales que se seleccionan mediante la orden WHERE. O sea, trabaja como si fuera una orden WHERE, pero sobre grupos de registros. 2. Se ubica después de la orden GROUP BY. 3. Puede usar una función de grupo diferente a la de la orden SELECT. El ejemplo a diseñar para nuestra aplicación es la consulta ¿cuál fue el artículo más vendido y en qué cantidad?. En este caso, la orden HAVING de la consulta principal selecciona aquellos artículos (GROUP BY) que tienen una venta total (SUM(valor)) igual a la mayor venta realizada por artículo (MAX(SUM(valor))) que devuelve la subconsulta. La sentencia SELECT y el resultado de nuestra consulta sería la del fuente 9 y la tabla 5: Fuente 9 SELECT articulo "ARTICULO MAS VENDIDO",SUM(valor) "VENTA" FROM ventas GROUP BY articulo HAVING SUM(valor) = ( Subconsulta para buscar SELECT MAX(SUM(valor)) el artículo más vendido FROM ventas con la formación de grupos GROUP BY articulo por artículo. ) ; ARTICULO MÁS VENDIDO VENTA 40 Manual del Alumno PAPEL 1872 Tabla 4: ventas por encima de su venta promedio Indices El índice es un instrumento que aumenta la velocidad de respuesta de la consulta, mejorando su rendimiento y optimizando su resultado. El manejo de los índices en ORACLE se realiza de forma inteligente, donde el programador sólo crea los índices sin tener que especificar, explícitamente, cuál es el índice que va a usar. Es el propio sistema, al analizar la condición de la consulta, quien decide qué índice se necesita. Por ejemplo cuando en una consulta se relacionan dos tablas por una columna, si ésta tiene definido un índice se activa, como en el caso cuando relacionamos la tabla de clientes y ventas por la columna código para identificar al cliente (WHERE clientes.codigo=ventas.codigo) La identificación del índice a usar está relacionada con las columnas que participan en las condiciones de la orden WHERE. Si la columna que forma el índice está presente en alguna de las condiciones éste se activa. No obstante, existen casos en que la presencia de la columna no garantiza el uso de su índice, ya que éstos son ignorados, como en las siguientes situaciones cuando la columna indexada es: Evaluada con el uso de los operadores IS NULL o IS NOT NULL. SELECT nombre,articulo,valor FROM clientes,ventas WHERE nombre IS NOT NULL; Modificada por alguna función, excepto por las funciones MAX(columna) o MIN(columna). SELECT nombre,articulo,valor FROM clientes,ventas WHERE UPPER(nombre)>' ' ; Usada en una comparación con el operador LIKE a un patrón de consulta que comienza con alguno de los signos especiales (% _). SELECT nombre,articulo,valor FROM clientes,ventas WHERE nombre LIKE '%DEPORTE%' ; Finalmente debemos aclarar que los registros cuyo valor es NULL para la columna indexada, no forman parte del índice. Por lo tanto, cuando el índice se activa estos registros no se muestran como resultado de la consulta. Programación PL/SQL 41 Manual del Alumno El lenguaje de programación de Oracle, llamado PL/SQL, es un lenguaje portable, procedural y de transacción muy potente y de fácil manejo, con las siguientes características fundamentales: 1. Incluye todos los comandos de SQL estudiados en el artículo Oracle Básico I y II (ver revista Algoritmo números 8 y 9, respectivamente): - 2. SELECT INSERT UPDATE DELETE. Es una extensión de SQL, ya que este es un lenguaje no completo dado que no incluye las herramientas clásicas de programación. Por eso, PL/SQL amplia sus posibilidades al incorporar las siguientes sentencias: - Control condicional IF ... THEN ... ELSE ... ENDIF - Ciclos FOR ... LOOP WHILE ... LOOP 3. Incorpora opciones avanzadas en: - Control y tratamiento de errores llamado excepciones. Manejo de cursores. Variedad de procedimientos y funciones empaquetadas incorporadas en el módulo SQL*Forms para la programación de disparadores (Trigger) y procedimientos del usuario (Procedure). Estructura del bloque de código Veamos a continuación la organización del bloque de código de PL/SQL, compuesto por cuatro secciones DECLARE, BEGIN, EXCEPTION y END como se detalla en el fuente 1: /* --- Fuente 1 ----------------------------------------------------------[<< nombre del bloque >>] Etiqueta que identifica al Bloque. [DECLARE] Declaración de Variable Constante Cursor Se inicializa con un valor que no se puede modificar. Area de trabajo que contiene los datos de la fila de la tabla en uso. El cursor es el resultado de una sentencia SELECT. para control de errores. ExcepciónVariables BEGIN Código. [EXCEPTION] Control y tratamiento de errores. 42 Manual del Alumno Es el punto al que se transfiere el control del programa siempre que exista un problema. Los indicadores de excepción pueden ser definidos por el usuario o por el sistema, como es por ejemplo la excepción ZERO_DIVIDE. Las excepciones se activan automáticamente al ocurrir un error, existiendo la definición de la excepción OTHERS que considera aquellos errores no definidos y que siempre se ubica al final de todas las excepciones. END [nombre del bloque]; Fin del Bloque. Con el ejemplo del fuente 2 ilustraremos las distintas secciones que componen un bloque de código en PL/SQL. En este caso deseamos calcular la venta promedio del día y, en caso que la misma sea menor a lo esperado, se debe registrar en la tabla VENTABAJA. /* --- Fuente 2 ----------------------------------------------------------DECLARE esperada CONSTANT NUMBER(5) := 500; xtotal NUMBER; xcant NUMBER; xprom NUMBER; BEGIN /*Asigna a la variable xtotal el TOTAL de las ventas y a la variable xcant la cantidad de ventas del día. */ SELECT SUM(valor),COUNT(valor) INTO xtotal,xcant FROM ventas WHERE fecha=sysdate; xprom:=xtotal/xcant; IF xprom >= esperada THEN message('Ventas por encima de la esperada'); pause; ELSE /*Se registra en la tabla ventabaja las ventas por debajo del promedio esperado */ INSERT INTO ventabaja VALUES (sysdate,xprom); END IF; EXCEPTION WHEN ZERO_DIVIDE THEN message('No se realizaron ventas en el día'); pause; WHEN OTHERS THEN message('Error Indefinido'); pause; END; Asignación de valores Las dos formas que existen para asignar valores a variables de memoria, vistas en el ejemplo anterior, son: - Con el operador de asignación :=, como cuando calculamos el promedio de las ventas asignándole valor a la variable xprom con la siguiente sentencia: xprom:=xtotal/xcant; 43 Manual del Alumno - Con la sentencia SELECT que contiene la orden INTO, como se muestra, es la asignación de valores a las variables xtotal y xcant con el siguiente código: SELECT SUM(valor), COUNT(valor) INTO xtotal,xcant FROM ventas WHERE fecha=sysdate; Veamos a continuación, con la creación del procedimiento FECHAALTA, la asignación de valores a una variable de registro llamada Client_Rec, que va a contener la estructura de una fila de la tabla CLIENTES y que estará formada por todos los campos correspondientes a la tabla. Para esto usaremos el atributo de variable %ROWTYPE que declara una variable de registro que contiene la estructura de la tabla, y después, con el uso de la sentencia SELECT * INTO, se asigna a la variable de registro los valores de la fila. La referencia a un dato contenido en la variable de registro se hace de la forma variable_registro.campo, como por ejemplo cliente_rec.fecha hace referencia a la fecha del alta del cliente. Pasemos a mostrar lo anteriormente expuesto a través del código del fuente 3. /* --- Fuente 3 ----------------------------------------------------------PROCEDURE FECHAALTA IS BEGIN DECLARE cliente_rec clientes%ROWTYPE; BEGIN SELECT * INTO cliente_rec FROM clientes WHERE codigo = 5; IF cliente_rec.fecha>sysdate-10 THEN message( cliente_rec.nombre|| ' Dado de alta en los últimos 10 días'); pause; ELSE message( cliente_rec.nombre|| ' Dado de alta hace más de 10 días'); pause; END IF; END; END; SELECT con control de excepciones La sentencia SELECT en PL/SQL no muestra en pantalla las filas resultantes de la consulta, como ocurre en SQL (el cual trabaja en forma interactiva) sino que, según sea la acción a realizar, así será la cantidad de filas devueltas por la consulta, existiendo en este caso una de las tres posibles situaciones recogidas en la tabla 1: Cantidad de filas Acción Una Se realiza la siguiente sentencia Más de una Ocurre la excepción TOO_MANY_ROWS Ninguna Ocurre la excepción NO_DATA_FOUND Tabla 1: Situaciones posibles según la búsqueda realizada 44 Manual del Alumno Por esta razón, veremos a continuación, a través de un ejemplo, el uso de la sentencia SELECT, con control de excepciones para definir la acción a realizar en dependencia de la cantidad de filas devueltas por la consulta. Veamos con el código del fuente 4 en el que se define el procedimiento VentasDe para consultar las ventas realizadas en el día de un determinado artículo: /* --- Fuente 4 ----------------------------------------------------------PROCEDURE ventasde(xarticulo ventas.articulo%TYPE) is BEGIN DECLARE xnombre clientes.nombre%TYPE; xventas NUMBER; BEGIN SELECT nombre into xnombre FROM clientes,ventas WHERE clientes.codigo=ventas.codigo AND ventas.fecha=sysdate AND articulo=xarticulo; message( 'Solo una venta de ' xarticulo¦¦' a: '¦¦xnombre); EXCEPTION WHEN NO_DATA_FOUND THEN message('No hay ventas de '||xarticulo); pause; WHEN TOO_MANY_ROWS THEN SELECT COUNT(*) INTO XVENTAS FROM ventas WHERE ventas.fecha=sysdate AND articulo=xarticulo; message( TO_CHAR(xventas)¦¦ ' Ventas de '¦¦xarticulo); pause; WHEN OTHERS THEN message('Error Indefinido'); pause; END; END; Este procedimiento ventasde recibe un parámetro que es el nombre del artículo a consultar, por lo cual, para ejecutarlo, se debe escribir ventasde('PAPEL'). Obsérvese también que la sentencia SELECT COUNT(*) INTO, usada en este ejemplo, siempre devuelve una fila, ya que no existe formación de grupos al no estar presente la orden GROUP BY. Por lo tanto, en este caso la única acción posible a realizar es pasar a la siguiente sentencia, o sea, no se requiere control de excepciones. Manejo de cursores El conjunto de filas resultantes de una consulta con la sentencia SELECT, como vimos anteriormente, puede estar compuesto por ninguna, una o varias filas, dependiendo de la condición que define la consulta. Para poder procesar individualmente cada fila de la consulta 45 Manual del Alumno debemos definir un cursor (que es un área de trabajo de memoria) que contiene los datos de las filas de la tabla consultada por la sentencia SELECT. Los pasos para el manejo de cursores, tema novedoso en la programación de Oracle con PL/SQL, son: - Definir el cursor, especificando la lista de parámetros con sus correspondientes tipos de datos y estableciendo la consulta a realizar con la sentencia SELECT. - Abrir el cursor para inicializarlo, siendo éste el momento en que se realiza la consulta. - Leer una fila del cursor, pasando sus datos a las variables locales definidas a tal efecto. - Repetir el proceso fila a fila hasta llegar a la última. - Cerrar el cursor una vez que se terminó de procesar su última fila. A continuación veremos un ejemplo de cursor con las siguientes características: Objetivo: Consultar las ventas de una fecha dada ordenadas de mayor a menor. Nombre: CVENTAS. Parámetros: cfecha, variable que contiene la fecha a consultar. Código de definición del cursor: Ver figura 1 Figura 1: Código de definición de cursor Con el procedimiento VENTAS5 del fuente 5, mostraremos cómo usar el cursor cventa anteriormente definido, con el fin de registrar en la tabla VENTAMAYOR las 5 mayores ventas en una fecha dada. /* --- Fuente 5 ----------------------------------------------------------PROCEDURE VENTAS5 (xfecha DATE) is BEGIN DECLARE CURSOR cventas (cfecha DATE) IS SELECT articulo,valor 46 Manual del Alumno FROM ventas WHERE fecha=cfecha ORDER BY valor DESC; xarticulo ventas.articulo%TYPE; xvalor ventas.valor%TYPE; BEGIN OPEN cventas(xfecha); FOR i IN 1..5 LOOP FETCH cventas INTO xarticulo,xvalor; EXIT WHEN cventas%NOTFOUND; INSERT INTO ventamayor VALUES (xfecha,xarticulo,xvalor); COMMIT; END LOOP; CLOSE cventas; END; END; Para llamar al procedimiento ventas5 en una fecha dada, se puede escribir, por ejemplo: ventas5(to_date('15/11/95','DD/MM/YY') o ventas5(sysdate). A continuación detallaremos las sentencias usadas en este procedimiento: DECLARE cursor Define el cursor, su consulta y la lista de parámetros que se pasan a la orden WHERE, es solo la declaración del cursor y no la realización de la consulta. xarticulo ventas.articulo%TYPE; Define la variable xarticulo igual a la columna articulo de la tabla ventas, que con el uso del atributo de variable %TYPE permite declarar una variable del mismo tipo que una columna de la tabla. No es necesario conocer cómo está definida esa columna en la tabla y, en caso que la definición de la columna sea modificada, automáticamente se cambia la variable xarticulo. OPEN cventas(xfecha); Realiza la consulta asociada al cursor, pasando el valor del parámetro y guardando sus resultados en un área de la memoria, desde la cual, posteriormente, se pueden leer estas filas. 47 Manual del Alumno FOR i IN 1..5 LOOP Ciclo numérico de repetición para poder consultar las 5 primeras ventas devueltas por el cursor. FETCH cventas INTO xarticulo,xvalor; Lee la siguiente fila de datos del cursor cventas y pasa los datos de la consulta a las variables xarticulo y xvalor. EXIT WHEN cventas%NOTFOUND; Garantiza la salida del ciclo antes de las última repetición, en caso que para una fecha dada se hayan efectuado menos de 5 ventas, ya que en esta situación la consulta del cursor devuelve menos de 5 filas. %NOTFOUND es un atributo de cursor que es verdadero cuando la última sentencia FETCH no devuelve ninguna fila. INSERT INTO ventamayor VALUES(xfecha,xarticulo,xvalor); Insertar en la tabla ventamayor los valores leídos desde el cursor. COMMIT; Actualización de la tabla ventamayor. END LOOP; Fin del ciclo. CLOSE cventas; Cierra el cursor, eliminado sus datos del área de memoria. Disparadores El módulo SQL*Forms tiene incorporado una colección de procedimientos y funciones llamados "empaquetados" que se pueden incluir en el código de procedimientos o disparadores (TRIGGER) definidos por el usuario. El disparador es un bloque de código que se activa cuando se pulsa una determinada tecla u ocurre cierto evento, como puede ser: 48 Manual del Alumno - Mover el cursor hacia o desde un campo, registro, bloque o forma. - Realizar una consulta. - Validar un dato. - Hacer una transacción al insertar, modificar o eliminar registros de la base de datos. Oracle asocia a cada tecla de función un procedimiento empaquetado, pudiendo el usuario redefinir esta asignación o capturar el disparador para ampliarlo o modificarlo con su propio código. INDICE 1. Alcance y Objetivos ..........................................................................................4 2. Conceptos Básicos ............................................................................................5 Arquitectura Oracle Instancia .....................................................................................5 ......................................................................................................5 Iniciando La Base de Datos ........................................................................7 Cerrando la Base de Datos .........................................................................8 Net8 ............................................................................................................9 3. Accediendo a la información ...............................................................................11 3.1. SQL *Plus y SQL ............................................................................…….….11 3.1.1. Consultar Información – comando SELECT ...................................12 3.1.2. Comando describe .........................................................................14 3.1.3. Edición de buffer de SQL*Plus .......................................................14 3.1.4. Tipos de Datos de Oracle ..............................................................15 3.1.5. Comando ........................................................................15 INSERT 49 Manual del Alumno 3.1.6. Comando UPDATE ........................................................................16 3.1.7. Comando DELETE .........................................................................17 3.1.8. Operaciones con funciones y tipos de datos ...................................17 3.1.8.1 Valores y funciones numéricas ........................................17 3.1.8.2 Referencia a valores y funciones de fecha .......................19 3.1.8.3 Referencia a valores y funciones de caracteres ...............21 3.1.8.4 Funciones de grupo .........................................................22 3.1.9. Cláusula GROUP BY en comando SELECT ..................................22 3.1.10. Cláusula HAVING en comando SELECT ........................................23 3.1.11. Proceso de comando SQL ...............................................................24 3.2 Transacciones ..............................................................................................24 3.2.1. Comando COMMIT ...........................................................................24 3.2.2. Comando ROLLBACK ......................................................................25 3.2.3. Concurrencia y Consistencia .............................................................25 4. Estructura de la Base de datos ..............................................................................27 Tablespaces ..................................................................................................27 Alcance y Objetivos Creando un tablespace ......................................................................27 Alterando un tablespace ....................................................................28 Borrando un tablespace .....................................................................28 Tablespace temporales ......................................................................28 50 Manual del Alumno Segmentos Extents .....................................................................................................29 ...........................................................................................................29 4.3.1. Cláusula Storage ................................................................................29 Bloques Oracle ..............................................................................................30 5. creación de los objetos de Base de Datos ..............................................................31 Tablas .............................................................................................................31 Creación de tablas ..............................................................................31 Modificación de tablas Borrar una tabla ........................................................................32 ..................................................................................32 Vistas ..............................................................................................................32 Indices ............................................................................................................33 5.3.1. Indices Unique ....................................................................................34 Secuencias .....................................................................................................34 Sinónimos .......................................................................................................35 5.5.1. Sinónimos públicos .............................................................................36 6. Uso de Constraints ..................................................................................................38 Constraint Not Null …………………………………………………………………38 Constraint Unique …………………………………………………………………..38 Constraint Check …………………………………………………………………...39 Constraint Primary Key …………………………………………………………….39 Constraint Foreing Key …………………………………………………………….40 Agregado Constraints ……………………………………………………………....41 Deshabilitar un Constraint Habilitar un Constraint Borrar un Constraint 7. El ………………………………………………………….41 ………………………………………………………………42 ………………………………………………………………...42 segmento Rollback ...............................................................................................44 Concepto ...........................................................................................................44 Alcance y Objetivos 51 Manual del Alumno Creación, eliminación y asignación de transacciones 8. Administración ...................................44 de usuarios .....................................................................................46 Creación .........................................................................................................46 Alteración de usuarios ....................................................................................46 Eliminación de usuarios ..................................................................................47 Terminando la sesión de usuarios ..................................................................47 Control de recursos del sistema ( Perfiles de usuarios ) 9. Privilegio ...............................48 de acceso ................................................................................................51 Privilegios de sistema Privilegio de objetos Usos de Roles .....................................................................................51 .......................................................................................53 ................................................................................................54 10. Creación de una Base de Datos .............................................................................57 Consideraciones Pasos a seguir ..........................................................................................57 ...............................................................................................57 Alcance y Objetivos 52 Manual del Alumno 1. Alcance y Objetivos Este curso tiene como alcance entender los conceptos generales de Oracle, administrar y manejar la información de la Base de datos y sus objetos. Los objetivos del curso se detallan a continuación: Conocimiento de la arquitectura de la Base de datos. Montar y desmontar una Base de Datos. Crear una Base de datos completa. Manejar la información de una Base de datos . Conocer los parámetros de configuración. Manejar la estructura de la base de datos con Tablespace. Definir el almacenamiento de las tablas, índices, clusters y otros objetos. Conocer el rollback segment y los segmentos temporales. Crear, monitorear y borrar usuarios. Otorgar privilegios de acceso. Alcance y Objetivos 53 Manual del Alumno 2. Conceptos Básicos Oracle es un administrador de base de datos relacional que brinda acceso a la información bajo una arquitectura abierta de fácil manejo y administración. Funciones del administrador de Base de datos: Instalar y actualizar el servidor Oracle y las herramientas de aplicación. Crear los archivos de almacenamiento y los objetos. Definir los tamaños de almacenamiento y planear los futuros requerimientos de espacio para la base de datos. Administrar la seguridad de usuarios y accesos. Respaldar y recuperar la información. Monitorear y optimizar la performance de la Base de datos. Arquitectura Oracle La forma como Oracle está diseñado para trabajar se puede describir en sus 3 componentes: Programas cargados en memoria que se encargan de ejecutar y controlar los comandos de la base de datos, manejan las áreas de memoria y los archivos físicos. Existen muchos procesos tales como el PMON, SMON, DBWR, etc, cada uno de ellos tiene una función específica. Estructura de Bloques de memoria en donde se almacena información de memoria : la base de datos, es necesario para el trabajo de server y para agilizar sus operaciones. El área de memoria destinado para este trabajo se conoce como SGA ( System Global Area ). Es una estructura física, archivos que contienen la data, Archivos : estructuras lógicas, registro de cambios hechos a la base, estos son: Data Files. Control Files y Redo Log Files. Procesos : Instancia Se denomina instancia a la combinación del SGA y los procesos de background. Cuando se inicia, el SGA se crea en la memoria y se inician los procesos de Background. Debemos distinguir entre una instancia Oracle y la base de datos. Primero la instancia es iniciada y luego la base de datos es cargada por la instancia. Conceptos Básicos 54 Manual del Alumno ARQUITECTURA ORACLE ************************************************************************************* *************************************************************************************** * INSTANCIA ORACLE Conceptos Básicos 55 Manual del Alumno Iniciando la Base de Datos Los pasos a seguir para iniciar el administrador de base de datos Oracle son 3: 1. Iniciar la instancia 2. Montar la Base de datos 3. Abrir una Base de datos El comando STARTUP permite realizar estos 3 pasos Se puede iniciar la Base de Datos desde el programa Server Manager, por ejemplo en Windows NT desde una ventana de interfaz de comandos en la siguiente forma: D:\>SVRMGR30 Las siguientes son cláusulas que pueden acompañar al comando startup: DATABASE OPEN MOUNT Especifica el nombre de la base de datos. Permite a los usuarios acceder a la base de datos. Monta la base de datos para ciertas actividades del DBA, pero no permite el ingreso de usuarios. NOMOUNT Crea el SGA e inicia los procesos background, pero no permite el acceso a la base de datos. EXCLUSIVE Permite solo a la actual instancia acceder a la base de datos. PARALLEL Permite a varias instancias acceder a la base de datos. PFILE = parfile Permite usar un archivo de configuración distinto al default. FORCE Aborta la instancia en ejecución antes de realizar un startup normal. RESTRICT Permite conectarse solo a los usuarios con el privilegio RESTRICTED SESSION. RECOVER Inicia la recuperación de la base de datos. Se puede iniciar una instancia Oracle sin montar la base de datos por ejemplo para crear una base de datos nueva. Conceptos Básicos 56 Manual del Alumno Luego para montarla o abrirla usaríamos el comando: ALTER DATABASE [ mount / open ] Una base de datos puede ser montada pero no abierta para realizar algunas funciones del DBA como por ejemplo para recuperar alguna información dañada. En este caso luego se iniciará Oracle con el comando: ALTER DATABASE OPEN; El estado de la base de datos puede ser alterado para permitir o no el acceso a usuarios con el siguiente comando: ALTER SYSTEM [ enable / disable ] RESTRICTED SESSION. Cerrando la Base de Datos Para cerrar la base de datos y desmontar la instancia s usa el siguiente comando: SHUTDOWN [ normal / immediate / abort ] Por ejemplo desde el Server Manager de la siguiente forma: Shutdown normal Nuevas conexiones no son permitidas. El servidor espera a que los usuarios conectados actualmente se desconecten de la base de datos para realizar el shutdown. Por default el shutdown es normal. Si se completa, la próxima vez que se inicie Oracle no se requerirá la recuperación de la instancia. Shutdown inmediate Los comandos SQL actualmente en proceso no son culminados y a todas las transacciones que no llegaron a culminarse se les realiza un rollback. Se cierra y desmonta la base de datos limpiamente. La siguiente vez que se inicie Oracle tampoco se necesitará una recuperación de la instancia. Conceptos Básicos 57 Manual del Alumno Shutdown abort Se cortan los comandos SQL, no se realiza rollback de las transacciones. No se cierra la base de datos, pero si la instancia. La próxima vez que inicie Oracle automáticamente se realizará la recuperación de la instancia. 2.5. Net8 – Software de comunicación Una vez que Oracle se inicia, el Oracle Server está disponible para trabajar desde el mismo servidor o desde una aplicación o herramienta en una PC o estación de trabajo. Net8 es un software que permite la conexión desde una PC de la red a la base de datos en un servidor, o desde un servidor a otro y utiliza el protocolo TNS (Transparent Network Substrate), este es interpretado a traves de adaptadores de protocolos standares como el IPX y el TCP / IP. Para configurar una conexión desde una estación cliente hacia un servidor Oracle se debe realizar lo siguiente: 1. Ingresar al programa “Net8 Easy Configuration” desde el menu del cliente Oracle instalado en el computador. 2. Escoger ala opción “Add Database Alias” para crear una conexión a la base de datos. 3. Escribir el nombre de la conexión, puede ser el mismo nombre de la base de datos o cualquier nombre que la identifique. 4. Escoger el protocolo con que se conecta la estación al servidor donde se reside la base de datos, por ejemplo TCP / IP. 5. Registrar el nombre del servidor o su dirección dependiendo del protocolo, así como el nombre de la instancia que maneja la base de datos. 6. El programa mostrará los datos registrados esperando la confirmación. Luego de confirmar los datos el cliente ya podrá con4ectarse a la base de datos a través de cualquier herramienta, por ejemplo SQL*Plus indicando el nombre de usuario, clave y el nombre de la conexión creada. Conceptos Básicos 58 Manual del Alumno PRACTICA DEL CAPITULO 2 1. Levantar la base de datos Oracle en estado MOUNT. 2. Selecciona los registros de la vista V$SGA. 3. Selecciona los registros de la vista V$PARAMETER. 4. Selecciona los datos de la vista DBA_USER. Que ocurre?. 5. Cambiar el estado de la Base de Datos de MOUNT a OPEN y volver a intentar visualizar los datos de la vista DBA_USERS. 6. Cerrar la base de datos Oracle sin esperar a que los usuarios finalicen sus operaciones. 7. Copia el archivo de parámetros initorcl.ora a otro con el nombre inittest.ora y modifica el nombre de la base de datos en este nuevo archivo. 8. Levantar la Base de Datos parámetros. Que ocurre? Oracle usando el nuevo archivo de 9. Usa el archivo de parámetros original para levantar la base de datos, restringiendo el acceso a los usuarios con el privilegio RESTRICTED SESSION. 10. Usar el comando ALTER SYSTEM para permitir el acceso a todos los usuarios. Conceptos Básicos 59 Manual del Alumno 3. Accediendo a la información 3.1. SQL*PLUS y SQL SQL*Plus es una herramienta diseñada para usarse con Oracle, la cual extiende la capacidad del SQL estándar ANSI, es decir reconoce y ejecuta comandos SQL y comandos especializados de SQL*Plus que pueden dar formato a reportes, proveer facilidades de ayuda y edición, y mantener variables de sistema. SQL ( Structured Query Language ) es un simple y potente lenguaje de acceso a base de datos, además es le lenguaje estándar para manejo de sistemas de base de datos relacional. El SQL implementado por Oracle es 100% compatible con el ANSI / ISO estándar SQL. Los comandos SQL pueden ser clasificados de la siguiente manera: De : definición de datos Comandos que permiten crear, alterar y eliminar objetos, así como también comandos que permiten otorgar privilegios de acceso, por ejemplo los comandos : CREATE, ALTER, DROP, GRANT, entre otros. De manipulación de datos Comandos de consulta, inserción, : actualización y borrado de datos, los comandos más conocidos son SELECT, INSERT, UPDATE y DELETE. De control de datos Manejan los cambios realizados por los : comandos de manipulación, entre ellos se encuentran el COMMIT, ROLLBACK, SAVEPOINT. Ingresando a SQL * Plus AL ingresas al programa desde el servidor o desde un cliente Windows, DOS o de alguna otra plataforma, SQL*Plus solicitará el nombre de usuario y clave en la base de Datos, una vez conectado aparecerá el siguiente mensaje: Accediendo a la información 60 Manual del Alumno De ingresar mal el nombre de usuario o la clave, se visualizará el mensaje y código de error respectivo. Para mayor detalle, Oracle nos muestra un código el cual puede ser consultado en el catálogo de errores. Otro ,motivo por el cual no se puede conectar a la base de datos, por ejemplo puede ser porque el driver de conexión (Net8) no está bien instalado o configurado. Esto en el caso que la conexión sea desde una estación de la red o remota. Para culminar una sesión en SQL*Plus: SQL>EXIT 3.1.1. Consultar información – Comando SELECT Seleccionar información de una base de datos, o consultarla, es una de las operaciones de base de datos más comunes. El comando Select es un comando muy potente que se usa para obtener la información contenida en una o más tablas, vistas y snapshots. Sintaxis: SELECT [all / distinct] fields FROM [table / view / snapshot] WHERE condition START WITH condition CONNECT by condition GROUP BY expr HAVING condition ORDER BY [expression / position] [ASC / DESC] FOR UPDATE OF expresion A toda esta sintaxis los requerimientos mínimos para un estatuto SELECT son: SELECT campo FROM nombre de la tabla. Ejemplo: SQL>Select empno, ename, job from emp; La cláusula WHERE permite adicionar condiciones de búsqueda: SELECT campo FROM nombre de la tabla WHERE condición Los operadores de comparación para esta cláusula son: = . ¡= <> ^= > >= < Accediendo a la información Igual . No igual a Mayor que Mayor o igual a Menor que a 61 Manual del Alumno <= BETWEEN....AND..... IN (List) IS NULL LIKE Menor o igual a Entre dos valores Igual o cualquier miembro de la lista Es un valor nulo Busca un patrón de caracteres caracteres comodín. usando Los operadores lógicos son: NOT AND OR Ejemplo: SELECT ename, job, sal FROM emp WHERE sal >= 1500 and job=’MANAGER’ or job = ‘SALESMAN’; Resultado: ENAME --------------ALLEN WARD JONES MARTIN BLAKE CLARK TURNER JOBSAL ------------------SALESMAN SALESMAN MANAGER SALESMAN MANAGER MANAGER SALESMAN SAL ----------1060 1250 2975 1250 2850 2450 1500 7 rows selected La cláusula ORDER BY se puede usar para ordenar en forma ascendente, descendente por múltiples columnas Ejemplo: SELECT ename, job, sal FROM emp WHERE deptno =30 ORDER BY job, sal DESC, ename; Resultado: ENAME JOBSAL --------------------------------Accediendo a la información JAMES CLERK SAL ----------950 62 Manual del Alumno BLAKE ALLEN TURNER MARTIN WARD MANAGER SALESMAN SALESMAN SALESMAN SALESMAN 2850 1600 1500 1250 1250 6 rows selected 3.1.2. Comando DESCRIBE Este comando de SQL*Plus permite visualizar la estructura de una tabla, vista o snapshot: SQL>DESCRIBE EMP Name ----------EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO Null? ------------NOT NULL NOT NULL Type ---------------------NUMBER (4) VARCHAR2 (10) VARCHAR2 (9) NUMBER (4) DATE NUMBER(7,2) NUMBER(7,2) NUMBER(2) 3.1.3. Edición del buffer de SQL con comandos de SQL*Plus Comando A[PPEND] C[HANGE] Descripción Añade un texto específico Al final de la línea actual en el buffer. Cambia la primer ocurrencia de texto en la línea actual del buffer con la cadena provista, por ejemplo: C/ENP/EMP. CL[EAR] BUFFER Limpia el buffer. DEL Borra la línea actual del buffer. I[NPUT] Añade una o más líneas de texto después de la línea actual en el buffer. Presione <RETURN> sobre una línea en blanco para salir del modo de entrada (input). L[IST] Lista de todas las líneas del buffer. L[IST] n Lista de la línea n del buffer. R[UN] Despliega y ejecuta el contenido del buffer. N Coloca el apuntador del buffer en la línea n. n<text string> Reemplaza el contenido actual de la línea con la cadena de texto provista. 3.1.4. Tipos de Datos Oracle Accediendo a la información VARCHAR2(n) Especifica una cadena de caracteres de longitud variable, la cual tiene un tamaño de longitud máxima en bytes. El 63 Manual del Alumno tamaño máximo es de 4000. El tamaño debe ser especificado para VARCHAR2. CHAR(n) Especifica una cadena de caracteres de longitud fija. El tamaño máximo es de 2000 bytes y el de default es de 1 byte. NUMBER (n,d) Valores numéricos consistentes de los dígitos 0-9, con signo (+,-) opcional y un punto decimal. La precisión n puede tener un rango de 1 a 38 y la escala d pude tener un rango de –84 a 127. Donde n es el número máximo de dígitos y d es el número máximo de decimales. LONG Cadena de caracteres de longitud variable que puede contener hasta 2 gigabytes. No se puede definir más de una columna tipo LONG por tabla. No se puede hacer un join de tablas usando una columna LONG como columna base del join o una búsqueda basada sobre una columna LONG. Una columna tipo LONG no puede aparecer en un constraint de integridad(excepto para el NULL y NOT NULL). DATE Valores tipo fecha y hora, desde Enero 1°, 4712 A.C a Diciembre 31, 4712 D.C RAW(n) Datos en binario, cuyo tamaño es en bytes. El tamaño máximo es de 2000 bytes y este debe ser especificado para la columna de tipo RAW. LONG RAW Datos en binario de longitud variable de tamaño hasta de 2 gigabytes. BLOB Datos en binario de longitud de hasta 4 gigabytes, los cambios realizados pueden ser manejados a través de transacciones con los comandos COMMIT o ROLLBACK. CLOB Datos en caracteres de hasta 4 gigabytes, también pueden ser manejados en transacciones. BFILE Datos en binario que se encuentran en archivos fuera de la base de datos. El campo almacena un puntero a la información de este archivo. Almacena hasta 4 gigabytes. 3.1.5. Insertando registros en una tabla – Comando INSERT El comando INSERT permite añadir registros a una tabla de la base de datos. Sintaxis INSERT INTO tabla [(columna1, columna2…..)] VALUES (valor1, valor2.....); Ejemplos: Accediendo a la información SQL>INSERT INTO DEPT VALUES(50,’FINANCE’,’LOS ANGELES’); 1 row created. 64 Manual del Alumno SQL>INSERT INTO INTO emp( empno, ename, hiredate, sal, deptno ) VALUES (100,’LERNER’, ’01-JAN-92’, 2000, 30 ); 1 row created. SQL>INSERT INTO emp( empno, ename, deptno) SELECT id, name, department FROM old_emp WHERE department IN(10,20,30,40); Fíjese que en el primer ejemplo no es necesario especificar el nombre de los campos de la tabla, el registro se insertará con los valores especificados en el orden según como se crearon los campos de la tabla. En el segundo ejemplo solo se registran datos para los campos indicados, en este caso es necesario escribirlos. El resto de campos se mantendrán con valor NULL. El siguiente ejemplo muestra que se puede agregar más de un registro con un solo comando INSERT haciendo uso del comando SELECT para tomar los registros de otra tabla. 3.1.6. Actualizando Registros – Comando UPDATE El comando UPDATE se utiliza para modificar los datos de una tabla. Sintaxis UPDATE tabla SET columna1=valor, columna2=valor…. [WHERE condición ] Ejemplos: SQL>UPDATE emp SET job = ‘SALESMAN’; sal = sal + 1.05, deptno = 30 WHERE empno =7788; 1 row updated SQL>UPDATE emp SET job=‘SALESMAN’ WHERE job =‘SALES’; 7 rows updated SQL>UPDATE emp set sal = 3000; Accediendo a la información 50 rows updated 65 Manual del Alumno los ejemplos nos muestran como actualizar un registro específico, como en el primer caso, luego un conjunto de registros y fíjese que en el último ejemplo se actualizarán todos los registros de la tabla, este comando puede ser muy útil pero a la vez peligroso si no se indica la cláusula WHERE por error. 3.1.7. Borrado de Registros – Comando DELETE El comando DELETE elimina registros de una tabla. Sintaxis: DELETE FROM tabla [ WHERE condición ]; Ejemplo: SQL>DELETE FROM emp WHERE empno = 1234; 1 row deleted. El ejemplo muestra la eliminación de un registro específico, se pueden eliminar varios registros según la condición, así como todos los registros de la tabla, esto sucede cuando no se escribe la cláusula WHERE. 3.1.8. 3.1.8.1. Operaciones con funciones y tipos de datos Valores y funciones numéricas Los cálculos se llevan a cabo usando las expresiones aritméticas de suma (+), resta (-), multiplicación (*), y división (/) y pueden ser usados en la mayoría de los comandos SQL. El resultado del cálculo se puede desplegar como si fuesen columnas con expresiones aritméticas en estatutos SELECT. Ejemplo: SQL>SELECT ename, sal, comm, sal+comm FROM emp WHERE job = ‘SALESMAN’ AND comm. > 0.25 * sal ORDER BY 4; Resultado: Accediendo a la información ENAME SAL COMM ----------------------------------WARD 1250 500 MARTIN 1250 1400 SAL+COMM ----------------1750 2650 66 Manual del Alumno Función NVL Con el valor de función nulo, NVL, se convierte un valor nulo a uno no nulo con el propósito de evaluar una expresión. Cuando NVL evalúa la primer expresión, si es NOT NULL (No nulo) regresa expr1, de otra forma regresa expr2. Sintaxis: NVL ( expr1 , expr2 ). Ejemplo: SELECT ename, job, sal, comm, NVL ( sal + 0 ) + NVL ( comm,0 ) FROM emp WHERE deptno = 30; Resultado: ENAME JOB SAL COMM comm,0 ) -------------- ----------------- --------------------------------ALLEN SALESMAN 1600 1900 WARD SALESMAN 1250 1750 JONES SALESMAN 2975 MARTIN SALESMAN 1250 2650 BLAKE MANAGER 2850 SCOTT SALESMAN 3150 TURNER SALESMAN 1500 1500 JAMES CLERK 850 NVL ( sal, 0 ) + NVL ( -------------------------------- 8 rows selected Ejemplos de algunas funciones: Función ROUND SQL>SELECT ename, sal, sal/22, ROUND( sal/22,0 ) FROM emp WHERE ename IN (‘ALLEN’,’JONES’); Accediendo a la información 300 500 2975 1400 2850 3150 0 950 67 Manual del Alumno ENAME -----------ALLEN JONES SAL ---------1600 2975 SAL/22 -----------------72.7272727 135.227273 ROUND( sal/22,0 ) -------------------------73 135 Función TRUNC SQL>SELECT ename, sal, sal/22, TRUNC( sal/22,0 ) FROM emp WHERE ename IN (‘ALLEN’,’JONES’); ENAME -----------ALLEN JONES 3.1.8.2. SAL ---------1600 2975 SAL/22 -----------------72.7272727 135.227273 TRUNC( sal/22,0 ) -------------------------72 135 Referencia a valores y funciones de fecha Use operaciones aritméticas sencillas en comandos SQL para ejecutar cálculos sobre valores de fechas en la base de datos. Fecha + número fecha. Fecha – número fecha. Fecha – Fecha Añade un número de días a la fecha, produciendo una Resta un número de días a la fecha, produciendo una Resta una fecha a otra, produciendo un número de días. Ejemplo: SQL>SELECT ename, hiredate, hiredate+90 FROM emp WHERE deptno = 10; ENAME --------------CLARK KING MILLER HIREDATE -------------------09-JUN-81 17-NOV-81 23-JAN-82 HIREDATE + 90 ---------------------07-SEP-81 15-FEB-81 23-APR-82 Algunas funciones : Función Ejemplo Resultado ADD_MONTHS ADD_MONTHS (HIREDATE,6) Regresa una fecha 6 meses después de la fecha de contratación. ADD_MONTHS (HIREDATE,-6) Accediendo a la información Regresa una fecha 6 meses antes de la fecha de contratación. 68 Manual del Alumno LAST_DAY LAST_DAY (HIREDATE) Regresa el ultimo día del mes que contiene una fecha de contratación. NEXT_DAY NEXT_DAY (HIREDATE,’FRIDAY’) MONTHS_BET WEEN MONTHS_BETWEEN (SYSDATE,HIREDATE) SYSDATE Regresa la fecha del primer Viernes después de la fecha de contratación. Regresa el número de meses entre hoy y la fecha de contratación. SYSDATE (no requieren Regresa la fecha y hora actual. argumento) La función de conversión TO_CHAR da formato al desplegado de valores de fecha. Ejemplo: (hiredate,’fmDD”of” Month YYYY’) “Data of Hire” emp deptno = 20; Resultado: Date of Hire -------------------17 of December 1980 12 of January 1983 3 of December 1981 Formatos de Fecha: DD Día del mes (ej: 1- 31) DY Día de la semana (ej: FRI) DAY Nombre del día en mayúsculas, ajustado con blancos a una longitud de 9 caracteres (ej: MONDAY) DDSPTH Nombre deletreado del día en mayúsculas (ej: TWELFTH) MM Mes ( 01-12 ) (ej: JAN=01) MON Nombre del mes en mayúsculas, abreviación de 3 letras (ej: JAN) 69 Manual del Alumno MONTH Nombre del mes en mayúsculas, ajustado con blancos a una longitud de 9 caracteres (ej: JANUARY) YY Año en 2 dígitos (ej: 91) Accediendo a la información YYYY Año en 4 dígitos (ej: 1991) HH:MI:SS Horas:Minutos:Segundos (ej: 09:00:00) Fm Modo de llenado: los elementos subsecuentes suprimirán los ajustes con blancos, dejando una variable de longitud variable ) 3.1.8.3. Referencia a valores y funciones de caracteres Combine columnas y constantes de caracteres en un desplegado que sea más significativo en su lectura que una lista de columnas recuperadas por SQL * Plus. Ejemplo – Concatenación Despliegue los nombres de los departamentos combinados con sus ubicaciones bajo el encabezado de DEPARTMENTS. SQL>SELECT dname II ‘- ‘II loc DEPARTMENTS FROM dept; Resultado: DEPARTMENTS ------------------------------------ACCOUNTING – NEW YORK RESEARCH – DALLAS SALES – CHICAGO OPERATIONS – BOSTON FINANCE – LOS ANGELES RESEARCH – BOSTON PERSONNEL – TAHITI EDUCATION – MAUI 8 rows selected Funciones: Función INITCAP Ejemplo INITCAP(ENAME) Resultado Regresa la primer letra de cada nombre en mayúscula, el resto en minúsculas (ej: Smith). 70 Manual del Alumno UPPER UPPER(ENAME) Regresa todos los caracteres en una cadena en mayúscilas (ej: SMITH) Accediendo a la LOWER(ENAME) información LOWER Regresa todos los caracteres en una cadena en minúsculas (ej: smith). SUBSTR SUBSTR(JOB, 1, 5) Regresa la regresa 5 MANAG) LENGTH LENGTH(ENAME) Regresa el número de caracteres en la cadena (ej: 6) 3.1.8.4. primer posición, caracteres (ej: Funciones de grupo Las funciones de grupo obtienen resultados basados en grupos de registros en vez de un resultado por registro. Función AVG Ejemplo AVG(SAL) Resultado Valor promedio de salaries. COUNT COUNT(COMM) Número de valores no nulos en la columna COMM. COUNT(*) Número de registros de una tabla. MAX MAX(SAL) Máximo salario de un empleado. MIN MIN(SAL) Mínimo salario de un empleado. SUM SUM(COMM) Suma de valores de COMM. 3.1.9. Cláusula GROUP BY en el comando SELECT La cláusula GROUP BY despliega una tabla en subgrupos de registros. Ejemplo: SQL>SELECT DEPTNO, COUNT(*) FROM emp GROUP BY deptno; DEPTNO COUNT(*) 71 Manual del Alumno -------------------------------------------------------10 3 20 3 30 8 3.1.10. Cláusula HAVING en el comando SELECT Accediendo a la información Para poner una condición en la función GROUP BY se utiliza la cláusula HAVING. Ejemplo: SQL>SELECT job, 12 * AVG( sal ) FROM emp GROUP BY job HAVING COUNT (*)>2; Resultado: JOB -----------------CLERK SALESMAN 12 * AVG ( ) -----------------------------12450 23450 En el ejemplo anterior se muestra el promedio de los salaries * 12 de los empleados agrupados por tipo de trabajo, pero solo de aquellos grupos que tienen más de 2 trabajadores. 72 Manual del Alumno 3.1.11. Proceso de un comando SQL : Accediendo a la información Todo comando SQL ejecutado en un base de datos Oracle pasa por las siguientes etapas: Parse Execute Fetch Parse Etapa de la preparación del comando en donde Oracle revisa la sintaxis del comando, revisa el diccionario de datos para validar los privilegios de acceso y busca la forma más rápida y efectiva de ejecutar el comando. Oracle usa un área de memoria llamada cursor para registrar la información de estado de un comando. Execute En este momento Oracle lee y graba la información física y lógica, realiza el chequeo de constraints y modifica la información si es necesario. Fetch Devuelve el resultado de los registrois solicitados por un comando SELECT. 3.2. Transacciones Oracle denomina transacción a una secuencia de comandos SQL. Una transacción comienza al iniciar una sesión Oracle o al final de una transacción previa. La transacción finaliza cuando se ejecuta el comando COMMIT o el comando ROLLBACK, también puede que el usuario aborte la transacción. 3.2.1. Comando COMMIT Inserciones, borrados y actualizaciones a tablas no se hacen permanentes hasta que el trabajo es salvado en la base de datos ejecutando el comando COMMIT. Hasta que el trabajo no es salvado, únicamente el usuario que hizo los cambios los puede ver; todos los demás usuarios ven los datos como estaban al momento del último COMMIT. Accediendo a la información 73 Manual del Alumno 3.2.2. Comando ROLLBACK El comando rollback cancela todos los cambios pendientes regresando al estado en que estaba la información al momento del último COMMIT. Ejemplo: COMMIT I INSERT I INSERT I DELETE I INSERT I ROLLBACK I UPDATE I UPDATE I COMMIT En esta secuencia de commandos que contiene 2 transacciones, sólo se actualiza la información modificada por los 2 últimos comandos UPDATE. 3.2.3. Concurrencia y Consistencia Dos de los requerimientos más importantes de un manejador se sistemas de información es el controlar la concurrencia y la consistencia de la información. Sin un control adecuado de la concurrencia la data puede ser cambiada o actualizada en mala forma, comprometiendo la integridad de la información. Los comandos DML, de manipulación de datos, tales como INSERT, DELETE, UPDATE, bloquean los registros en forma implícita hasta que se liberan con el comando COMMIT; Cuando un usuarios solicita información de la base de datos no espera a que otro realice COMMIT a sus transacción en caso de que esté trabajando con la misma información solicitada. Tampoco el usuario que graba la información espera a que termine el comando SELECT de otro usuario. Un usuario solo espera el término de la transacción de otro usuario cuando intenta actualizar un mismo registro o registros de la base de datos. PRACTICA DEL CAPITULO 3 Accediendo a la información 74 Manual del Alumno 1. Use la tabla EMP para completar los ejercicios siguientes: a) Despliegue los nombres y fecha de contratación de cada empleado. b) Despliegue la información del paso 1 con la fecha de contratación apareciendo primero. c) Despliegue a los empleados que ganen más de $2000. Etiquete a la columna como Employee. d) Despliegue a los empleados que no son oficinistas (clerks) o vendedores (salesman). Ordene la lista por nombre de empleado. e) Despliegue los nombres de empleados cuyos nombres contengan la letra “S”. f) Despliegue los nombres de empleados y salarios para aquellos que ienen un salario menor que su comisión. Etiquete al nombre de empleado como Name y a la columna de salario como Salary. g) Despliegue a todos los empleados contratados en 1981. h) Despliegue la cantidad de empleados de los departamentos 10 y 20. 2. Use las tablas NATION e INVENTION para completar los ejercicio faltantes: a) Despliegue todas las invenciones de Edison y el año en que fueron inventadas. b) Despliegue todas las naciones cuya capital es Wellington o Georgetown. c) Despliegue todas la naciones que tienen poblaciones entre 230,000 y 820,000. Ordénelas de forma ascendente por nación. d) Despliegue los inventores, invenciones y años de todas la invenciones que no fueron inventadas entre 1800 y 1900. Ordene la lista por invención, usando la posición de columna. e) Despliegue lo 10 primeros caracteres del nombre del inventor para todos aquellos cuyo nombre empieza con la letra L. Accediendo a la información 75 Manual del Alumno 4. Estructura de la Base de Datos 4.1. Tablespaces Una base de datos Oracle puede subdividirse en áreas conocidas como tablespaces. Cada tablespace está compuesto por uno o más archivos del sistema operativo. El tablespace SYSTEM se crea en el momento de crear una base de datos, en él se almacena las tablas y vistas del diccionario de datos Oracle. Un tablespace puede permanecer en línea o fuera de línea excepto el tablespace SYSTEM. Se crean tablespaces en una base de datos para almacenar segmentos rollback, segmentos temporales, información de las aplicaciones, índices, etc. 4.1.1. Creando un Tablespace Para crear un tablespace se utiliza el comando CREATE TABLESPACE de la siguiente forma: CREATE TABLESPACE nombre_tablespace DATAFILE nombre_archivo SIZE tamaño DEFAULT STORAGE cláusula_storage [ ONLINE/OFFLINE ] Ejemplo: Estructura de la Base de Datos Create ts_tablas_inventario Datafile ‘E:\ORADATA\INVENTA\DFINV01.ORA’ size 20M; tablespace 4.1.2. Alterando un tablespace Se puede modificar TABLESPACE: un tablespace a través del comando ALTER TABLESPACE nombre_tablespace ADD DATAFILE nombre_archivo SIZE tamaño RENAME DATAFILE nombre_archivo1 TO nombre_archivo2 [ ONLINE/OFFLINE ] ALTER 76 Manual del Alumno Ejemplo: Alter Tablespace ts_tables_inventario offline; Alter tablespace ts_tablas_inventario Add datafile ‘E:\ORADATA\INVENTA\DFINV02.ORA’ size 20M; 4.1.3. Borrando un tablespace Un tablespace puede ser eliminado cuando ya no se requiere la información contenida en él. El comando DROP TABLESPACE se usa para este fin de la siguiente forma: DROP TABLESPACE nombre_tablespace INCLUDING CONTENTS; Ejemplo: Drop tablespace ts_tables_inventario INCLUDING CONTENTS; Un tablespace que contiene información no puede ser eliminado sin la cláusula INCLUDING CONTENTS. Una vez que el tablespace es eliminado la información dentro de él no estará disponible. 4.1.4. Tablespaces temporales Los tablespaces temporales son usados por la base de datos para ejecutar operaciones implícitas como por ejemplo para sortear información. Para utilizar un tablespace como temporal se utiliza la cláusula TEMPORARY al momento de crear el tablespace. Por default el tablespace se crea con la opción PERMANENT. 4.2. Segmentos Estructura de la Base de Datos Un segmento es un conjunto de extents. Un segmento puede relacionarse a un objeto en la base de datos. Los tipos de segmentos que existen son: Segmento rollback Segmento de data Segmentos de índices Segmentos temporales Conjunto de extents donde se almacena información de recuperación. Un conjunto de extents que forman una tabla. Conjunto de extents que forman un índice. Conjunto de extents que almacenan información de objetos temporales. 77 Manual del Alumno 4.3. Extens Un extents es un conjunto de bloques continuos. Cuando un objeto de la base de datos s crea o necesita crecer en almacenamiento, se crea un nuevo extent. Cada segmento en la base de datos es creado con un extent como mínimo. El primer extent creado es llamado INITIAL EXTENT. Los siguientes extents son llamados NEXT EXTENTS. La creación frecuente de extents en un segmento puede ocasionar la fragmentación de un tablespace. 4.3.1. Cláusula Storage El control en la creación de extents se maneja a través de la cláusula STORAGE Storage Parameters: INITIAL Tamaño en Bytes del primer extent de un segmento. NEXT Tamaño en bytes de los siguientes extents de un segmento. MAXEXTENTS Especifica el número total de extents que pueda tener el segmento. MINEXTENTS Número de extents a generarse cuando se crea el segmento. Por default es 1. PCTINCREASE Porcentaje de incremento en el tamaño para los siguientes extents a crearse. 4.4.Estructura Bloques Oracle de la Base de Datos Un bloque Oracle es la mínima unidad de almacenamiento usando en la base de datos. El tamaño del bloque Oracle es determinado en el momento de la creación de la base de datos en el parámetro DB_BLOCK_SIZE. Una vez que la base de datos es creada, el tamaño del bloque no puede ser cambiado. Este tamaño es usado tanto para los bloques físicos como para los bloques de memoria usados por Oracle. El siguiente cuadro muestra la relación entre segmentos, bloques y extents: 78 Manual del Alumno 5. Creación de Objetos de la Base de Datos Estructura de la Base de Datos 5.1. Tablas 5.1.1. Creación de Tablas Para crear una tabla se usa el comando CREATE TABLE de la siguiente forma: CREATE TABLE Nombre_tabla ( columna1 tipo_dato constraint_columna1, columna2 tipo_dato constraint_columna2, .......) TABLESPACE nombre_tablespace STORAGE cláusula_storage AS subquery; Ejemplos: 79 Manual del Alumno CREATE TABLE in_equipos_computo ( cod_equip number (4), empno number (4), fech_asig date ) storage (initial 512K next 64K minextents 1 maxextents 200); CREATE TABLE in_detalle_equipos ( cod_equip number (4), cod_tipo number (3), cod_marca number (3), memoria number (4), caracter varchar2(30)) storage (initial 5M next 512K minextents 1 maxextents 100); CREATE TABLE in_tipos_equipos ( cod_tipo number (3), descripcion char (20)) storage (initial 4K next 4K minextens 1 maxextents 100); CREATE TABLE in_marcas ( cod_marca number (3), descripcion char (20)) storage (initial 4K next 4K minextens 1 maxextents 100); Reglas de nomenclatura: Debe ser un nombre con longitud de 1 a 30 caracteres, siendo el primer carácter alfabético. Solamente debe contener los caracteres: Creación de objetos A - Z, a – z, 0 – 9 , _(subrayado) No debe ser una palabra reservada de Oracle. No debe ser igual al nombre de otro objeto dentro del mismo usuario ORACLE. 5.1.2. Modificación de Tablas La sentencia ALTER TABLE se utiliza para alterar la definición de un tabla: Añadiendo columnas restricciones. Modificando definiciones de columnas (tipos de datos, NOT NULL, etc) Ejemplos: SQL> ALTER IN_EQUIPOS_COMPUTO ADD (fech_mante TABLE date); 80 Manual del Alumno SQL> ALTER IN_DETALLE_EQUIPO MODIFY (caracter TABLE VARCHAR2(40)); 5.1.3. Borrar una Tabla Para eliminar una tabla use el comando DROP TABLE de la siguiente manera: DROP TABLE nombre_Tabla; Ejemplo: SQL> DROP TABLE IN_MARCAS; 5.2. Vistas Una vista es una representación lógica de una o más tablas. Una vista no contiene datos. Todos los datos son derivados de la(s) tabla(s) subyacentes. Para crear una vista use el comando CREATE VIEW de la siguiente forma: SQL> CREATE VIEW nombre_vista as sentencia_select; Ejemplo: SQL> CREATE VIEW mantenimiento as SELECT cod_equip, fech_mante from IN_EQUIPOS_COMPUTO Where sysdate-fech_mante>90; Para eliminar una vista se usa el comando DROP VIEW por ejemplo: Creación de objetos SQL> DROP VIEW mantenimiento; En el siguiente ejemplo vemos una vista STAFF que visualiza la información contenida en la table EMP: 81 Manual del Alumno 5.3. Indices Los índices son estructuras opcionales asociadas a tables empleadas para agilizar la ejecución de consultas o garantizar la existencia única de un registro específico. El servidor ORACLE accesa datos en dos forma: FULL TABLE SCAN (secuencia) INDEX (selective) Se debe crear un índice si se anticipa que habrá recuperación frecuente de menos del 10-15% de los registros en una tabla grande y además las columnas son frecuentemente referenciadas por una cláusula WHERE. Características de las columnas para indexación: La columna es usada frecuentemente en cláusulas WHERE. Cada valor es único ( el mejor caso ). Amplio rango de valores. Muchos nulos/relativamente pocos valores. Una tabla puede tener cualquier número de índice, en este caso hay una relación implícita e indirectamente proporcional entre la velocidad de consulta contra la velocidad de actualización. Sintaxis: Creación de objetos CREATE [UNIQUE] INDEX Nombre_indice ON Tabla (columna1, columna2....) STORAGE cláusula_storage; Ejemplo: SQL> CREATE INDEX i_equipos_computo1on In_equipos_computo (cod_equip) Storage (initial 64K next 4K minextents 1 maxextents 200); Oracle usará el índice creado en este caso: SQL> SELECT * from in_equipos_computo where cod_equip=23; Pero no en este caso; SQL> SELECT * from in_equipos_computo; El commando DROP INDEX se utiliza para eliminar un índice, por ejemplo: 82 Manual del Alumno SQL> DROP INDEX i_equipos_computo1; 5.3.1. Indices UNIQUE Los índices sirven para asegurar que no existan dos registros con valores idénticos en las(s) columna(s) indexada(s). Ejemplo: SQL> CREATE UNIQUE INDEX i_marcas1 on IN_MARCAS (cod_marca); 5.4. Secuencias Se crean secuencias para generar números enteros únicos para múltiples usuarios. Los números de secuencia pueden ser usados para generar llaves primarias automáticamente. Sintaxis para la creación de secuencias: CREATE SÉQUENSE nombre_secuencia INCREMENT BY n START WITH n MAXVALUE n MINVALUE n; Ejemplo: Creación de objetos SQL> CREARE SEQUENCE s_cod_equip START WITH increment by 1 MAXVALUE 9999; Una secuencia se incrementa de la siguiente forma: SQL> SELECT s_cod_equip.nextval from dual; También se puede incrementar así: SQL> INSERT INTO in_equipos_computo values (s_cod_equip.nextval, 100, to_date(’01-APR-99’,’DD-MON-YY’)); Una secuencia se elimina con el commando DROP SEQUENCE, por ejemplo: SQL> DROP SÉQUENSE s_cod_equip; 5.5. Sinónimos Los sinónimos son alias que se crean sobre las tablas o vistas de la base de datos para un mejor manejo del acceso a dichos objetos. 83 Manual del Alumno El nombre completo de una tabla está compuesto por el nombre del dueño y el nombre de la tabla, por ejemplo la tabla emp se llama SCOTT.EMP. Si un usuario llamado MARK trata de leer datos de esta tabla debería hacer lo siguiente: SQL > SELECT * from SCOTT.EMP; Sin embargo se podría crear un sinónimo para esta tabla de la siguiente manera: SQL > CONNECT MARK/OPER SQL > CREATE SYNONYM EMP for SCOTT.EMP; SQL > SELECT * FROM EMP; La sintaxis es la siguiente: CREATE [PUBLIC] SYBONYM nombre_sinónimo FOR [owner.]nombre_objeto; El sinónimo creado viene a ser un objeto más de la base de datos cuyo dueño es el usuario que lo ha creado. 5.5.1. Sinónimos públicos Creación de objetos Los sinónimos públicos son creados por un usuario con nivel de administrador este sinónimo puede ser utilizado por cualquier usuario de la base de datos. Por ejemplo: SQL > CONNECT SYSTEM/MANAGER SQL > CREATE PUBLIC SYNONYM emp for scot.emp; Si los usuarios JACKSON y KORDA tienen acceso a la tabla EMP del usuario SCOTT pueden leer los datos de la siguiente forma: SQL> SELECT * from emp; Esto debido a que existen el sinónimo público; Eliminar un sinónimo Para eliminar un sinónimo se usa el siguiente comando: DROP [PUBLIC] SYNONYM nombre_sinónimo; Ejemplo: SQL > CONNECT SYSTEM/MANAGER SQL > DROP PUBLIC SYNONYM EMP; 84 Manual del Alumno PRACTICA DEL CAPITULO 4 Y 5 1. Conectarse a la Base de datos como usuario SYSTEM. Crea un nuevo tablespace llamado RBS en un datafile llamado rbs01.ora de 10 KB con un default de MINEXTENTS=2 y PCTINCREASE=0. 2. Crea un nuevo tablespace llamado TEMP para segmentos temporales en un archivo llamado TEMP01.ORA de 200 KB con un default PCTINCREASE de 0. 3. Crea un nuevo tablespace llamado APPL_DATA en un archivo appl01.ora de 200 KB con un default INITIAL d 20 KB , NEXT de 10 KB y PCTINCREASE de 0. 4. Finalmente crea un tablespace llamado USERS_DATA en un archivo users01.ora de 1 MB. 5. Verificar que los tablespace han sido creados viendo el diccionario de datos. 6. Crea una tabla llamada TEST en el tablespace USER_DATA con un INITIAL EXTENT de 50 KB. Qué ocurre? 7. Crea una tabla test como copia de la tabla TEST2 en el tablespace USERS_DATA, luego alterar el tablespace USERS_DATA en modo READ ONLY y trata de dropear la tabla TEST2. Qué ocurre y por qué? 8. Escribir una consulta que visualice el total de esoacio libre en bloques y en bytes para cada tablespace. 9. Modificar la consulta anterior para listar el espacio libre por datafile. 10. Escribir una consulta que visualice los segmentos que ocupan más de 50 extents en la base de datos. Creación de objetos 85 Manual del Alumno 6. Uso de Constraints Los constraints son condiciones o restricciones que se aplican a los campos de una tabla para garantizar la integridad de la información de la base de datos. Se pueden crear al momento de crear una tabla o posteriormente. Los tipos de constraints son: NOT NULL UNIQUE CHECK PRIMARY KEY FOREIGN KEY Sintaxis: CREATE TABLE nombre_tabla (nombre_columna1 tipo_columna1 nombre_columna2 tipo_columna2 constraint_tabla1 constraint_tabla2….; constraint_columna1, constraint_columna2,.....) El constraint puede ser definido junto a la declaración de cada columna o al final de la creación de la tabla. 6.1. Constraint NOT NULL Cuando una columna deba contener valores use el constraint not null. Este constraint asegura que al momento de insertar o actualizar una columna esta contenga datos. Ejemplo: SQL > CREATE TABLE Clientes ( Nombre CHAR(30)CONSTRAINT cons_clients_nombre NOT NULL, ……); Table created. 6.2. Constraint UNIQUE Asegura que 2 o más filas en una tabla no tengan valores duplicados. ejemplo: Por SQL > CREATE TABLE clientes ( …..; DNI NUMVER(10) CONSTRAINT cons_clients_dni UNIQUE USING INDEX TABLESPACE ts_clients STORAGE (initial 500k next 100k) ….); Constraints 86 Manual del Alumno Table created. Un índice es automáticamente creado para el constraint unique. El nombre del índice es el mismo que el del constraint. La cláusula USING INDEX sirve para especificar el tablespace y los parámetros de almacenamiento para el índice. 6.3. Constraint CHECK Verifica que una condición especificada para una o más columnas sea verdadera. Ejemplo: SQL > CREATE TABLE cliente ( …., tip_documento char(1) CONSTRAINT cons_clients_tipdoc CHECK (tip_documento in (‘1’,’2’,’3’)), ....); Table created. Una columna puede tener múltiples constraints de chequeo. 6.4. Constraint PRIMARY KEY Compuesto por uno o más campos que identifican a cada fila en una tabla. Por ejemplo: SQL > CREATE TABLE clientes( Codigo NUMBER(6) KEY, …..); Table created. CONSTRAINT cons_clients_pk PRIMARY SQL > CREATE TABLE factura( Ser_factura number(3), Num_factura number(8), ….., CONSTRAINT cons_factura_pk num_factura), …..); Table created. PRIMARY KEY (ser_factura, En el primer caso se define una clave primaria para un solo campo, en el segundo caso la clave primaria es compuesta y el constraint debe ser definido al final de la declaración de los campos. 87 Manual del Alumno Los campos que forman parte de la clave primaria por definición son “únicos” y “no” “nulos”, en este caso también se genera un índice. 6.5. Constraint FOREIGN KEY Constraints Controla que el valor de una columna especificada como FOREIGN KEY exista en la clave primaria de otra tabla. Por ejemplo: SQL > CREATE TABLE DEPT( Deptno NUMBER(7) CONSTRAINT s_dept_pk_id PRIMARY KEY,….); Table created. SQL > CREATE TABLE EMP( ….., DEPTNO NUMBER(7) CONSTRAINT s_emp:fk_dept_id REFERENCES s_dept (id), …..); Table created. Si se inserta en una fila un código de departamento válido, el comando procederá porque el valor existe en la clave primaria, por ejemplo: SQL > INSERT INTO s_emp VALUES (26,…..,10); 1 row inserted. Sin embargo si hacemos lo siguiente: SQL > INSERT INTO s_emp VALUES (26,…..,80); Nos aparecerá el mensaje: ERROR at line 1; ORA-02291:integrity constraint (S_EMP_FK_DEPT_ID) Violated-parent key not found Constraints 88 Manual del Alumno En este caso el código de departamento 80 no existe en las tablas s_dept. Ejemplo de constraints con claves compuestas: CREATED TABLE master( a NUMBER(4), b NUMBER(4), CONSTRAINT master_ok_ab PRIMARY KEY (a,b)); CREATED TABLE detail( a NUMBER(4), b NUMBER(4), c NUMBER(4), CONSTRAINT detail_fk_ab FOREIGN KEY (a,b) REFERENCES master; …..); 6.6. Agregando Constraints Para agregar constraints a una tabla ya existenete se utiliza el comando ALTER TABLE, por ejemplo: SQL > ALTER TABLE s_emp ADD(CONSTRAINT s_emp_pk_id PRIMARY KEY(id), CONSTRAINT s_emp_ck_salary CHECK(salary >500)); SQL > ALTER TABLE s_emp ADD(CONSTRAINT s_emp_fk_manager_id FOREIGN KEY (manager_id) REFERENCES s_emp); En el primer ejemplo se altera la tabla s_emp para agregar 2 constraint, uno con clave primaria y el otro para verificar no se ingrese un salario igual o menor a 500. En el segundo caso se crea un constraint FOREIGN KEY que hace referencia a la clave primaria de la misma tabla. 6.7. Deshabilitar un Constraint Para que un constraint ya existente deje de funcionar momentáneamente se usa el comando ALTER TABLE de la siguiente forma: ALTER TABLE nombre_tabla DISABLE CONSTRAINT nombre_constraint [CASCADE]; La cláusula CASCADE se usa en el caso que existan otros constraint que dependan del constraint a deshabilitar, por ejemplo se usa para en un constraint PRIMARY KEY. Constraints 89 Manual del Alumno 6.8. Habilitar un Constraint Para hacer funcionar nuevamente un constraint se usa el siguiente comando: ALTER TABLE nombre_tabla ENABLE CONSTRAINT nombre_constraint [CASCADE]; La tabla del diccionario de datos USER_CONSTRAINTS puede ser consultada para verificar el estado del constraint. 6.9. Borrar un Constraint Para eliminar un constraint también se usa el comando ALTER TABLE de la siguiente forma: ALTER TABLE nombre_tabla DROP CONSTRAINT nombre_constraint [CASCADE]; Constraints 90 Manual del Alumno PRACTICA DEL CAPITULO 6 Crear las siguientes tablas con la definición de constraints indicada: TABLA CONTRATO Num_contrato F_contrato Codcli Monto number(6) date char(6) number (10,2) TABLA CONTRATO_DETALLE Num_contrato c_secuencia tipo_joya sub_tipo_joya peso monto number(6) number(2) char(2) char(2) number(5,2) number(10,2) TABLA CLIENTES codcli nombre tipo_docum num_docum c_distrito direccion char(6) char(30) char(1) number(10) char(2) char(30) CONSTRAINTS Tabla Constraint Campo Contrato Contrato Contrato Contrato_detalle Clientes Clientes primary key not null foreign key foreign key primary key not null num_contrato f_contrato codcli num_contrato codcli nombre Constraints 91 Manual del Alumno 7. El segmento ROLLBACK 7.1. Concepto El segmento rollback es una porción de la base de datos donde se guarda la información antes de ser modificada por una transacción, permitiendo que los cambios hechos a la información puedan ser restaurados. Los rollback segments se almacenan en los tablespace y puede existir más de uno en un tablespace. Existe un primer rollback segment en el tablespace SYSTEM, pero se deben crear rollback adicionales en otros tablespace para empezar a ejecutar transacciones en la base de datos. Cada transacción es asignada a un rollback segment, las transacciones buscan el primer rollback segment que se encuentre disponible a no ser que se especifique el nombre del rollback a utilizar. 7.2. Creación, eliminación y asignación de transacciones Para crear un rollback segment se utiliza el siguiente comando: CREATE PUBLIC ROLLBACK SEGMENT nombre_rollback_segment TABLESPACE nombre_tablespace STORAGE cláusula_storage; Ejemplo: CREATE PUBLIC ROLLBACK SEGMENT segment1 TABLESPACE ts_rollback_seg1 STORAGE (initial 10K next 10K minextents 2 maxextents 121); Un rollback segment debe contener como mínimo 2 extends y el parámetro PCTINCREASE es siempre 0 y no puede ser especificado. Cuando se crea un rollback segment por default se coloca OFFLINE . Para alterar un rollback segment y activarlo se usa el siguiente comando: ALTER ROLLBACK SEGMENT segment ONLINE; También se pueden alterar los parámetros de almacenamiento del rollback con el comando ALTER ROLLBACK SEGMENT. Para que una transacción trabaje con un rollback específico se usa el comando: Segmento Rollback 92 Manual del Alumno SET TRANSACTION USE ROLLBACK SEGMENT SEGMENT1; Por ejemplo: SQL > SET TRANSACTION USE ROLLBACK SEGMENT SEGMENT1; SQL > UPDATE EMP SET salary = salary * 1.5; SQL > COMMIT; El siguiente ejemplo muestra como eliminar un rollback segment: DROP ROLLBACK SEGMENT SEGMENT1. 8. Administración de usuarios Segmento Rollback 8.1. Creación 93 Manual del Alumno CREATE USER nombre_usuario IDENTIFIED BY [clave_usuario] [EXTERNALLY] DEFAULT TABLESPACE nombre_tablespace TEMPORATY TABLESPACE nombre_tablespace FROFILE nombre_frofile QUOTA [UNLIMITED][integer] ON nombre_tablespace Donde: EXTERNALLY Verifica el acceso a la base de datos a través del sistema operativo. DEFAULT TABLESPACE Indica el tablespace donde por default se crearán los objetos del usuario. TEMPORARY TABLESPACE Indica el tablespace temporal del usuario. Se usa para los procesos internos de Oracle como por ejemplo para sortear tablas. QUOTA Especifica el tamaño en KB o MB (integer) que el usuario puede almacenar en un tablespace. UNLIMITED permite usar todo el espacio del tablespace. PROFILE Asigna un profile al usuario Ejemplo: SQL > CREATE USER scott IDENTIFIED BY tiger DEFAULT TABLESPACE user_data TEMPORARY TABLESPACE ts_temporal QUOTA 15M ON user_data; Statement processed. Para administrar la creación de usuarios también podemos utilizar la herramienta Schema Manager desde un cliente Oracle en Windows o desde un servidor NT. 8.2. Alteración de usuarios Con el comando ALTER USER se puede modificar las definiciones hechas al momento de crear un usuario. Sintaxis: ALTER USER nombre_usuario IDENTIFIED BY [clave_usuario] [EXTERNALLY] Administración de usuarios DEFAULT TABLESPACE nombre_tablespace TEMPORARY TABLESPACE nombre_tablespace PROFILE nombre_profile 94 Manual del Alumno QUOTA [UNLIMITED] [integer] ON nombre_tablespace Ejemplo: SQL > ALTER USER scott DEFAULT TABLESPACE ts_tables_inventario; 8.3. Eliminación de usuarios Para eliminar un usuario se utiliza el comando DROP USER de la siguiente forma: DROP USER nombre_usuarios [CASCADE] La cláusula CASCADE se usa para eliminar todos los objetos pertenecientes al usuario. Ejemplo: SQL > DROP USER scott; Statement processed. 8.4. Terminando la sesión de usuario Cuando un usuario está haciendo uso de un recurso que se necesita urgentemente o en algún otro caso se puede terminar la sesión de un usuario con el comando ALTER SYSTEM. Sintaxis: ALTER SYSTEM KILL SESION ‘integer1,integer2’ Donde: Administración de usuarios Integer1 EL ID de la sesión Integer2 Número de la serie de la sesión. Estos valores pueden obtenerse de la tabla v$sesion, por ejemplo: 95 Manual del Alumno SQL > select sid, serial#, username from v$session; SID ------------8 SERIAL# ----------------103 USERNAME ------------------SCOTT Ejemplo: SQL > Alter system kill session ‘ 8, 103’; Statement processed. 8.5. Control de recursos del sistema Para controlar los recursos del sistema por usuario se utilizan los perfiles de usuario (profiles) , estos trabajan con los siguientes recursos: Tiempo de CPU. Operaciones de I/O. Tiempo en espera. Tiempo de conexión. Espacio de memoria. Sesiones concurrentes. Cuando una sesión sobrepasa los límites especificados en el profile sucede que: Se ejecuta rollback sobre la transacción actual. Todos los comando anteriores permanecen intactos. Solo comandos COMMIT, ROLLBACK o DISCONNECT son permitidos. No se permite cualquier otro trabajo sobre la sesión actual. Las limitaciones de recursos se pueden habilitar o deshabilitar del sistema mediante el comando ALTER SYSTEM: ALTER SYSTEM SET RESOURCE_LIMIT= {TRUE/FALSE}; La base de datos por default no controla el límite de recursos por usuario, a no ser que se especifique el valor TRUE en el parámetro RESOURCE_LIMIT del archivo de configuración de oracle INIT.ORA. Crear un Profile Administración de usuarios Para crear un profile se utiliza el comando CREATE PROFILE así: CREATE PROFILE nombre_profile LIMIT restricciones; Las restricciones son: 96 Manual del Alumno CPU_PER_SESSION Tiempo de uso del CPU en milisegundos para una sesión. CPU_PER_CALL Tiempo de uso del CPU en milisegundos por operación a la base de datos. SESSIONS_PER_USER Número de sesiones concurrentes por usuario. CONNECT_TIME Tiempo de conexión del usuario en minutos. IDLE_TIME Tiempo de inactividad en minutos. LOGICAL_READS_PER_SESSION Número de bloques de datos físicos y de memoria que pueden leerse. Ejemplo: SQL > CREATE PROFILE developer_profile LIMIT SESSIONS_PER_USER5 CPU_PER_CALL UNLIMITED IDLE_TIME 60; Profile created. Modificar u profile Este es un ejemplo de modificación de profile: SQL > ALTER PROFILE developer_profile LIMIT SESSIONS_PER_USER2 CPU_PER_SESSION 300000 LOGICAL_READS_PER_CALL 1000; Profile altered. Default profile Cada base de datos tiene un profile llamado default el cual se asigna a todos los usuarios que no tiene un profile específico. La definición de este profile puede ser también modificada por el comando ALTER PROFILE, por ejemplo: SQL > ALTER PROFILE default LIMIT SESSIONS_PER_USER5 CPU_PER_CALL 3600 IDLE_TIME 30; Profile altered. Para asignar un profile a un usuario se utiliza la cláusula profile al momento de crearlo o utilizando comando ALTER USER, por ejemplo: Administración deelusuarios SQL > CREATE USER anna IDENTIFIED BY clave DEFAULT TABLESPACE user_data TEMPORARY TABLESPACE ts_temporal PROFILE developer_profile; 97 Manual del Alumno SQL > ALTER USER anna PROFILE developer_profile; Eliminar un profile Para eliminar un profile use el siguiente comando: SQL > DROP PROFILE developer_profile; Administración de usuarios 98 Manual del Alumno 9. Privilegios de Acceso Se pueden otorgar privilegios a usuarios para el acceso a la base de datos y a los objetos de la base de datos. El control de privilegios involucra: Dar a un usuario el derecho a realizar un tipo de operación. Habilitar y restringir acceso a modificar la información. Habilitar y restringir la posibilidad de realizar funciones del sistema y cambiar la estructura de la base de datos. Dar derechos a usuarios en forma individual o en grupo. Dar derechos a todos los usuarios. Tipo de privilegio SYSTEM OBJECT 9.1. Descripción Cada privilegio del sistema permite a los usuarios realizar una operación o tipo de operación en la base de datos. Cada privilegio del sistema permite realizar una operación sobre una tabla, vista, procedimiento, función o package. Privilegios del sistema Los privilegios de SISTEMA no especifican un determinado objeto, estos especifican una operación o tipo de operación. Por ejemplo el privilegio SELECT ANY TABLE permite que un usuario puede ver la información de cualquier tabla de la base de datos. Un privilegio de objeto permite a un usuario consultar una tabla en particular, como por ejemplo SCOTT.EMP. Para otorgar un privilegio se sistema se usa el comando GRANT de la siguiente forma: GRANT {privilegio_sistema / rol} to {usuario / rol / PUBLIC} [UIT ADMIN. OPTION]; donde: ROL PUBLIC UIT ADMIN. OPTION Privilegios de acceso Grupo de privilegios a otorgar. Acceso a todos los usuarios. Permite que el usuario que recibe el acceso pueda dárselo a otro usuario o rol. Si se da acceso a un rol con ADMIN. OPTION el usuario puede alterar o borrar el rol. 99 Manual del Alumno Para dar un privilegio de sistema, el usuario que lo brinda debe haber recibido el privilegio con ADMIN. OPTION. Por ejemplo: SQL > CONNECT SYSTEM/MANAGER SQL > GRANT ALTER USER TO SCOTT; Para visualizar los privilegios de sistema que pueden ser otorgados use la vista DBA_SYS_PRIVS de la siguiente manera: SQL > SELECT * from DBA_SYS_PRIVS; GRANTEE ----------------------------CONNECT CONNECT CONNECT CONNECT CONNECT CONNECT CONNECT CONNECT DBA YES DBA YES DBA YES DBA YES DBA YES DBA YES DBA YES DBA YES DBA YES …… PRIVILEGE ---------------------------------------------- ADM ------ ALTER SESSION NO CREATE CLUSTER NO CREATE DATABASE LINK NO CREATE SEQUENCE NO CREATE SESSION NO CREATE SYNONYM NO CREATE TABLE NO CREATE VIEW NO ALTER ANY CLUSTER ALTER ANY INDEX ALTER ANY PROCEDURE ALTER ANY ROLE ALTER ANY SEQUENCE ALTER ANY SNAPSHOT ALTER ANY TABLE ALTER ANY TRIGGER ALTER DATABASE Quitando privilegios del sistema Para quitar un privilegio de sistema se utiliza el comando REVOKE de la siguiente forma: REVOKE {privilegio_sistema / rol} FROM {usuario / rol / PUBLIC}; 100 Manual del Alumno Ejemplo: SQL > REVOKE ALTER USER FROM SCOTT; Statement Processed. 9.2. Privilegios de los objetos Privilegios de accesorealizar una o más operaciones sobre una tabla, vista, Permite a los usuarios secuencia o algún otro objeto. Los tipos de privilegios objeto varían dependiendo del objeto. Los comandos SQL permitidos por los privilegios de objetos son: Privilegio de Objeto SELECT UPDATE INSERT ALTER DELETE EXECUTE INDEX REFERENCES Comando SQL permitidos SELECT FROM objeto (tabla, vista o snapshot) UPDATE objeto (tabla o vista) INSERT INTO objeto (tabla o vista) ALTER objeto (tabla o secuencia), CREATE TRIGGER ON objeto(tablas) DELETE FROM objeto (tablas o vistas) TRUNCATE objeto (tablas) EXECUTE objeto (procedimiento o función) CREATE INDEX ON objeto (tablas) CREATE o ALTER TABLE definiendo un constraint de clave foránea. (tablas) Para dar privilegios sobre objetos se usa el comando GRANT así: GRANT {privilegio_objeto / ALL} [(columna)] ON [owner]. Objeto TO {usuario / rol / PUBLIC} [WITH GRANT OPTION]; Ejemplos: SQL > GRANT SELECT, INSERT (EMPNO, ENAME, DEPTNO), UPDATE (ENAME) ON emp TO mark; Statement processed. En el primer ejemplo se está dando acceso de consulta a los usuarios mark y jacson sobre la tabla EMP. En el segundo caso el accseo es de consulta, inserción sobre algunos campos y actualización sobre el campo ENAME de la tabla EMP para el usuario mark. Para visualizar los accesos otorgados a los usuarios sobre los objetos se utiliza la vista DBA_TAB_PRIVS, la cual tiene la siguiente estructura: 101 Manual del Alumno Name Null? -----------------------------------GRANTEE NOT NULL OWNER NOT NULL TABLE_NAME NOT NULL GRANTOR NOT NULL PRIVILEGE NOT NULL Privilegios de acceso GRANTABLE Type -------------------------------VARCHAR2 (30) VARCHAR2 (30) VARCHAR2 (30) VARCHAR2 (30) VARCHAR2 (40) VARCHAR2 (3) Donde: GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE Usuario que recibe el privilegio. Dueño del objeto. Nombre del objeto. Usuario que otorga el privilegio. Privilegio otorgado. UIT GRANT OPTION sí o no. Quitando privilegios sobre los objetos Para quitar un privilegio de objeto se usa el comando REVOKE de la siguiente forma: REVOKE privilegio_objeto ON [owner.]objeto FROM {usuario / rol / PUBLIC}; Ejemplo: SQL > REVOKE ALL ON EMP FROM mark; Statement processed. 9.3. Roles Un rol es un conjunto de privilegios de sistema o de objetos que se pueden asignar a los usuarios para facilitar la administración de accesos. Normalmente se debe crear un rol para el acceso de objetos o del sistema por cada aplicativo o tipo de usuario. 102 Manual del Alumno Creando un rol Privilegios de acceso Para crear un rol se usa el siguiente comando: CREATE ROLE nombre_rol; Una vez creado el rol se otorga los privilegios al rol y luego se asigna el rol al usuario. Ejemplo: SQL > CREATE ROLE rol_inventario; SQL > GRANT all on in_equipos_computo to rol_inventario; SQL > GRANT all on in_detalle_equipos to rol_inventario; SQL > GRANT select on in_tipos_equipos to rol_inventario; SQL > GRANT select on in_marcas to rol_inventario; SQL > GRANT rol_inventario to jackson; En el ejemplo se crea un rol llamado “rol_inventario” al cual se da acceso a 4 tablas, luego se incluye al usuario Jackson dentro del rol “rol_inventario”. De esta forma el usuario jackson y todos los que se incluyan en este rol tienen acceso a las 4 tablas. Parsa visualizar los privilegios de sistema y de objetos asignados a usuarios existen las vistas ROLE_SYS_PRIVS y ROLE_TAB_PRIVS. También se pueden asignar roles a otros roles y visualizarlos en la vista ROLE_ROLE_PRIVS. Eliminar un rol Para eliminar un rol se usa el comando: DROP ROLE nombre_rol; 103 Manual del Alumno PRACTICA DEL CAPITULO 8 Y 9 1. Crear los siguientes usuarios en la Base de datos: OWNER_CONTRATOS Este usuario debe tener privilegio de conexión a la base de datos y todo lo necesario para crear los objetos de la práctica anterior. Debe crear además los sinónimos públicos para su acceso posterior. OPS$YAGUILA OPS$SQUIROZ Son usuarios que van hacer uso del aplicativo y por lo tanto debemos crear un rol CONTRATO para el acceso a las tablas (insert, update, delete y select). OPS$OPERADOR El operador debe tener acceso para levantar y cerrar la base de datos, además de controlar el acceso a las sesiones de los usuarios y a las tablas del usuario OWNER_CONTRATOS. 2. Modificar la clave de los usuarios SYS y SYSTEM 3. Crear un PROFILE para los usuarios de los aplicativos que controle el tiempo de conexión inactiva de 15 minutos y 1 conexión por usuario como máximo. 4. Realizar una consulta para visualizar los accesos del role CONTRATO. 5. Realizar una consulta para revisar los usuarios que tienen los privilegios del rol CONTRATO. 6. Listar los objetos de cada usuario en la base de datos. Privilegios de acceso 104 Manual del Alumno 10. Creando una Base de Datos 10.1. Consideraciones Antes de crear una Base de Datos existen algunos puntos que se deben tener en cuenta como por ejemplo: Cual será la estructura de los archivos físicos a crear, es decir en que unidades y directorios se van a grabar los archivos de los diferentes tablespaces de la base de datos así como los archivos de control y backup. Estimar el espacio requerido para el tablespace SYSTEM y para el resto de objetos de la base de datos. Cuál será el tamaño del bloque Oracle. 10.2. Pasos a seguir Los pasos a seguir para crear una base de datos son: 1. Crear el archivo de parámetros Una instancia para cualquier base de datos es iniciada usando un archivo de parámetros. Existe un archivo de oparámetros llamado initorcl.ora que se usa para la creación de la base de datos que se crea en la instalación de Oracle, este puede servir de modelo para la nueva base de datos a crear. Editar el archivo de parámetros para revisar los siguientes parámetros: DB_NAME DB_DOMAIN CONTROL_FILES DB_BLOCK_SIZE DB_BLOCK_BUFFERS ROLLBACK_SEGMENTS Nombre de la base de datos a crear. Nombre de un dominio, se usa para base de datos distribuidas. Nombre de los archivos de control. Tamaño del bloque Oracle. Cuántos bloques Oracle se almacenan en SGA. Rollback segments que serán activados en la base de datos. Ejemplo: DB_NAME = CISS DB_DOMAIN = UNI CONTROL_FILES C:\ORADATA\DBS\CONTROL1.ORA, D:\ORADATA\DBS\CONTROL2.ORA DB_BLOCK_SIZE = 2048 Creación de la base de datos = 105 Manual del Alumno Se recomienda crear más de un archivo de control en discos distintos para tener respaldo en caso falle uno de ellos. Recuerde que el primer rollback segment que se crea es el rollback SYSTEM, luego debe crearse un rollback segment adicional en el tablespace SYSTEM. De acuerdo al número de transacciones el resto de rollback segments se crearán en cualquier tablespace creado para este propósito. 2. 3. Ingresar a Server Manager y conectarse a Oracle como un administrador. Arrancar la instancia Iniciar la instancia especificando el archivo de parámetros a no ser que se use el default, de la siguiente manera: SVRMGR > STARTUP C:\ORANT\DATABASE\INITUNI.ORA; NOMOUNT PFILE= El parámetro NOMOUNT indica que no se debe montar ninguna base de datos. 4. Crear la base de datos Para crear la base de datos se usa el comando CREATE DATABASE, por ejemplo: CREATE DATABASE CISS datafile ‘ c:\oradata\dbs\system01.ora,’ SIZE 30M LOGFILE ‘ c:\oradata\dbs\log01.ora’ SIZE 512K, ‘ sys:oradata\dbs\log02.ora’ size 512K MAXDATAFILES 100; Al crear la base de datos Oracle realiza lo siguiente: Crea los archivos de control de disco. Crea los archivos redo en el disco. Crea el tablespace SYSTEM y el rollback SYSTEM. Crea el diccionario de datos. Crea los usuarios SYS y SYSTEM. Monta y abre la base de datos para su uso. Creación de la base de datos