Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus
Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 1
DISEO DE BASES DE DATOS Y SEGURIDAD EN LA INFORMACIN CURSO 2004/2005 APUNTES PARA LAS PRCTICAS 1er CUATRIMESTRE
Para cualquier consulta a la sintaxis de las rdenes SQL o SQL*PLUS puede consultarse cualquier libro de ORACLE, o los manuales gratuitos en pdf o en lnea accesibles a partir de la pgina de la asignatura (en http://kybele.escet.urjc.es/).
Para las prcticas voluntarias del primer parcial se utilizar el servidor relacional de ORACLE. El programa cliente que se utilizar ser SQL*PLUS. SQL*PLUS admite las sentencias SQL propias de ORACLE ms otras propias para el formateo de la salida, etc. Fundamentalmente se utilizarn los siguientes comandos de SQL*PLUS: PASSWORD: Para cambiar el password del usuario (tambin puede cambiarse mediante ALTER USER). /: ejecuta el comando SQL o PL/SQL almacenado en el buffer. RUN: lista y ejecuta el comando SQL o PL/SQL almacenado en el buffer. HOST comando: ejecuta un comando del SO. LIST: lista el contenido del buffer. @ o START fichero: ejecuta un fichero EDIT [fichero]: edita el fichero, o bien la sentencia almacenada en el buffer. Para poder utilizar esta opcin en el laboratorio el fichero auxiliar utilizado por SQL*PLUS debe estar en un directorio en el que el usuario tenga permiso de escritura. Puede cambiar el directorio por defecto en Opciones/Editfile. DEFINE [variable[=valor]]: define o muestra el valor de variables SPOOL [fichero|OFF]: manda la salida a fichero o deja de hacerlo. DESCRIBE objeto: describe una tabla, vista o sinnimo. Existen otras instrucciones tiles de edicin y carga de ficheros como APPEND, CHANGE, GET, SAVE. La forma de trabajar ser utilizar un editor de texto para guardar las instrucciones en un VFULSW(creacin de las tablas, insercin de datos, consultas, etc.). Es conveniente incluir en el VFULSW antes de cada creacin de tabla un borrado de la misma mediante la instruccin DROP TABLE tabla [CASCADE CONSTRAINTS]. De esta forma nos aseguramos que la tabla no existe, evitando errores. Mediante la opcin CASCADE CONSTRAINTS nos aseguramos que la tabla se borra aunque existan dependencias entre tablas que impediran su borrado.
Aunque el lenguaje SQL admitido por ORACLE es muy similar al estndar visto en clase (SQL:1999), existen algunas diferencias que se irn descubriendo en el desarrollo de las prcticas. Las ms importantes son los tipos de datos, las opciones de borrado y modificacin de claves ajenas, y la creacin de dominios (ORACLE no admite dominios, los cuales debern simularse mediante CHECKs o tablas auxiliares).
ORACLE admite una gran variedad de tipos de datos. Los ms importantes, que sern los que fundamentalmente se utilicen en las prcticas son: CHAR (tamao): cadenas de caracteres de longitud fija. VARCHAR2 (tamao): cadenas de caracteres de longitud variable, hasta un mximo tamao. NUMBER (l,d): nmero de un mximo de l dgitos, d de los cuales son decimales. Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 2 DATE: fecha. Probablemente sea necesario utilizar funciones de formateo de tipos, tales como to_date o to_char (vase ms adelante en este mismo documento).
Aunque en los manuales podr consultarse la sintaxis completa del SQL, la sintaxis bsica de la instruccin de creacin de tablas es la siguiente:
CREATE TABLE nombre ( columna1 tipodatos [DEFAULT valorpordefecto] [restricciones de columna1], ... columnaN tipodatos [DEFAULT valorpordefecto] [restricciones de columnaN], [restriccin de tabla], ... [restriccin de tabla]);
Como vemos en la sintaxis, no es obligatorio darle un nombre a las restricciones, aunque puede resultar conveniente para poder identificar posibles errores en el caso de las inserciones rechazadas por ORACLE. ORACLE slo admite opciones en el caso de borrado de claves ajenas (a diferencia del estndar). Las nicas opciones admitidas son borrado en cascada, con puesta a nulos y restringido (que es la opcin por defecto en el caso de no poner nada). Evidentemente, cuando una clave ajena tiene como opcin de borrado la puesta a nulos, las columnas asociadas debern admitir este valor.
ORACLE, como todo SGBD, mantiene un catlogo que almacena datos acerca de los usuarios, tablas, privilegios, etc. Podemos acceder al catlogo por medio de vistas que pueden consultarse. Realizando una consulta a la vista ALL_CATALOG vemos todos los objetos (tablas, vistas, sinnimos) visibles por el usuario. Algunas vistas tiles son USER_TABLES, USER_VIEWS, etc.
Instrucciones ALTER TABLE, INSERT, DELETE y UPDATE. La sintaxis bsica es la siguiente:
ALTER TABLE tabla -> ADD (columnas, restricciones de columnas y/o restricciones de tabla) MODIFY (columnas y restricciones de columnas) Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 3 DROP PRIMARY KEY|UNIQUE(columnas) DROP CONSTRAINT restriccin DROP COLUMN columna (columnas) [DISABLE UNIQUE (columnas)/PRIMARY KEY/CONSTRAINT restriccin [CASCADE];] [ENABLE UNIQUE (columnas)/PRIMARY KEY/CONSTRAINT restriccin;]
Para la insercin de datos usaremos la instruccin INSERT. Si no indicamos las columnas, el sistema supondr que estamos insertando valores en todas ellas.
INSERT INTO tabla/vista [(columnas)] subconsulta/VALUES (expresiones);
Para el borrado usaremos la siguiente sintaxis. Si no incluimos la clusula WHERE, se borrarn todas las filas.
DELETE [FROM] tabla/vista [WHERE condicin];
Para la modificacin de valores se utilizar la siguiente sintaxis. Anlogamente al caso anterior, si no usamos la clusula WHERE se modificarn todas las filas.
UPDATE tabla/vista SET columna=expresin|subconsulta (columnas)=subconsulta WHERE [condicin];
Hay que tener en cuenta que en el caso de las vistas debern cumplirse determinadas condiciones para permitir las inserciones, borrado y actualizaciones de las tablas base.
La sintaxis bsica de la orden SELECT es la siguiente:
SELECT [ALL | DISTINCT] <lista-de selecciones> FROM <nombre de tabla> [alias de tabla] [,...] [WHERE <condicin>] [GROUP BY <lista-de columnas> [HAVING <condicin>] ] [ORDER BY <nombre de columna> [ASC | DESC] [,...] ]
DISTINCT: Elimina las filas duplicadas en el resultado de la consulta.
<alias de tabla>:Es un sinnimo activo slo en el mbito de la sentencia SELECT.
Las condiciones pueden incluir operadores lgicos (AND, OR, NOT). En las condiciones podemos utilizar, entre otras, las siguientes expresiones:
< expresin1> [NOT] BETWEEN <expresin2> AND <expresin2>
<expresin> [NOT] IN (<lista-de valores>)
<nombre de columna> [NOT] LIKE <string> [ESCAPE <carcter de escape>] Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 4
<nombre de columna> IS [NOT] NULL
Expresiones con subconsulta, que permiten comparar el valor de una expresin con los resultados de una sentencia SELECT (subconsulta). De esta forma se pueden producir encadenamientos de sentencias SELECT.
ORDER BY <nombre de columna> [ASC | DESC] [,...] Permite ordenar el resultado de la consulta.
COMPOSICIN DE TABLAS. La composicin (join) de tablas se produce cuando se combinan datos de dos o ms tablas. Para poder realizar la composicin deben existir columnas comunes a las tablas, de forma que al componer dos tablas A y B con las columnas comunes X e Y se satisface una condicin del tipo A.X=B.Y o similar (utilizando otros operadores, como >, <, etc). Estas condiciones se incluyen en la condicin de la clasula WHERE. Esto puede generalizarse a ms de dos tablas, por ejemplo (A.X = B.Y1) AND (B.Y2 = C.Z). En el caso de realizar una composicin de una tabla consigo misma, obligatoriamente hay que emplear alias dentro de la orden SELECT que eviten los problemas de ambigedad.
Algunas de las funciones aplicables a datos de tipo carcter son:
initcap(char) pone en mayscula el primer carcter de cada cadena de caracteres. lower (char) pone en minsucla la cadena de caracteres completa replace(char, str1, str2) En la cadena de caracteres char, cada ocurrencia de str1 se reemplaza por str2 substr(char,m,n) Extrae n caracteres de la cadena de caracteres char, a partir de la posicin m. length(char) Longitud de char
Entre las funciones especficas para fechas tenemos:
sysdate Fecha y hora actual last_day ltimo da del mes actual add_months(d,n) suma o resta n meses a partir de la fecha d months_between(f,s) diferencia en meses entre la fecha f y la fecha s next_day(d,day) Fecha del da especificado (lunes, martes, ...en ingls)de la semana siguiente a d
Otras funciones tiles para el tratamiento de fechas son to_char y to_date, que devuelven, respectivamente, un dato en formato carcter o fecha. El uso bsico es el siguiente: to_char (expresin, plantilla) to_date (cadena, plantilla) Entre los posibles cdigos a usar en la plantilla tenemos los siguientes:
Y devuelve el ltimo dgito del ao YY devuelve los dos ltimos dgitos del ao YYY devuelve los tres ltimos dgitos del ao YYYY devuelve los cuatro ltimos dgitos del ao SYEAR, YEAR ao, utilizando signo para las fechas a.C. Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 5 Q trimestre del ao MM mes RM mes en nmeros romanos Month Nombre del mes (9 caracteres) WW semana del ao W semana del mes DDD da del ao DD da del mes D da de la semana DY Abreviatura del nombre del da HH o HH12 Hora del da HH24 hora del da utilizando las 24 MI minutos SS segundos
Para una consulta ms detallada tanto de las funciones anteriores como de otras muchas, pueden consultarse los manuales de ORACLE accesibles desde la pgina de la asignatura.
Por ltimo hay que resaltar el hecho de que es posible sumar a las fechas valores de la forma: fecha+n. En este caso Oracle suma n das a la fecha, teniendo en cuenta posibles desbordamientos de meses o aos.
La clusula GROUP BY se utiliza cuando se quieren realizar consultas agrupadas. As, se puede pensar en estos conjuntos de filas como grupos, utilizndose las siguientes funciones (que tambin pueden ser utilizadas sin GROUP BY):
avg(nombre_columna) Valor medio de todos los valores de nombre_columna count(*) Nmero de filas de la tabla max(nombre_columna) Valor mximo almacenado en nombre_columna min(nombre_columna) Valor mnimo almacenado en nombre_columna
Ejemplo: select ciudad, avg(ventas) from clientes group by ciudad;
Hay que tener en cuenta que hay que agrupar todas las columnas que no aparezcan mencionadas en la clusula group_by.
La clusula HAVING se utiliza para especificar una condicin de bsqueda de un grupo de filas. Por ejemplo: select ciudad, avg(ventas) from clientes group by ciudad having ciudad>t;
SUBCONSULTAS. Una subconsulta forma parte de una condicin de bsqueda en la clusual WHERE o HAVING. Adems de las vistas en la prctica anterior, tambin se pueden aplicar las siguientes condiciones de bsqueda en subconsultas: Test de comparacin subconsulta. Compara el valor de una expresin con el valor producido por una subconsulta y devuelve un valor true si la comparacin es cierta.
Operadores: >, <>, <, <=, >, >=
Ejemplo: Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 6 SELECT nombre FROM tabla WHERE columna > (SELECT col FROM tabla2 WHERE ...);
Test de pertenencia a conjunto subconsulta. Compara un nico valor de datos con una columna de valores producida por una subconsulta y devuelve un resultado true si el valor coincide con uno de los valores de la columna.
Operador: IN
Ejemplo: SELECT nombre FROM tabla WHERE col IN (SELECT col FROM tabla2 WHERE...);
Test de existencia. Comprueba si una subconsulta produce alguna fila de resultados. Slo se utiliza en subconsultas.
Operador: EXISTS
Ejemplo. Listar las oficinas donde haya ventas por encima de 100 SELECT nombre FROM oficina WHERE EXISTS (SELECT * FROM ventas WHERE ventas.oficina=oficina.id AND cant_ventas>100)
Test de comparacin cuantificada. Se utilizan cuando una subconsulta devuelve ms de un valor. Compara un valor de dato con la columna de valores producidos por una subconsulta. SOME y ANY son equivalentes y se utilizan para aplicar a la consulta cada resultado de una subconsulta. ALL se utiliza para comparar el valor del test con todos los resultados de una subconsulta, si todos devuelven TRUE, entonces se ejecutar la consulta.
Operadores: SOME, ANY, ALL
Ejemplo. SELECT nombre FROM tabla WHERE ciudad = ANY (SELECT nombre FROM tabla2 WHERE codigo<3);
Aunque las subconsultas suelen encontrarse tras la clusula WHERE, tambin pueden ir tras la clusula HAVING.
Ejemplo. SELECT nombre, avg(importe) FROM ventas, pedidos WHERE ventas.idemp=pedidos.idemp AND fabrica=lafabrica GROUP BY nombre HAVING avg(impventas)> (SELECT avg(imppedidos) FROM pedidos));
VISTAS
Una vista es una representacin lgica de subconjuntos de datos de una o ms tablas. Pueden presentarse conjuntos lgicos de combinaciones de datos creando vistas de tablas. Diseo de Bases de Datos y Seguridad en la Informacin Apuntes Oracle y SQL*Plus Grupo Kybele, http://kybele.escet.urjc.es/ Pg. 7 Las vistas es una tabla lgica (no fsica) que se basa en una tabla o en otra vista. Una vista no contiene datos en si misma, es como una ventana a travs de la cual pueden verse y cambiarse datos de tablas. Las tablas sobre las que se define una vista se llaman tablas base. La vista se almacena como una sentencia SELECT en el diccionario de datos.
Donde: OR REPLACE. Se utiliza por si la vista ya estuviera creada anteriormente. De esta forma una vista podr ser modificada. FORCE. Crea la vista independientemente de si la tabla base existe. NOFORCE. Crea la vista slo si la tabla base existe. Est opcin es la que est por defecto. Subconsulta. Es una sentencia SELECT WITH READ ONLY. Asegura que no podrn ejecutarse operaciones DML sobre la vista.
Algunas reglas para utilizar instrucciones DML en una vista
No puede borrarse una fila si la vista contiene: Funciones de agrupamiento Una clusula GROUP BY La clusula DISTINCT No pueden modificarse datos de una vista si: Se cumple alguna de las condiciones del borrado Las columnas estn definidas mediante expresiones No se pueden aadir datos a una vista si: Se cumple cualquiera de las condiciones del borrado Hay columnas NOT NULL en la tabla base que no estn seleccionadas en la vista