UD 8: Creacin, supresin y modificacin de tablas y istas
Objetivos: Conocer el DDL de Oracle. Crear tablas y vistas en Oracle. Manipular tablas previamente creadas en Oracle. Borrar tablas y vistas existentes en Oracle. Crear sinnimos para referirnos a objetos de Oracle.
!rofesor: Gabriel Mern Cubero Correo: !abmecu"!mail.com
"#D$C% D% C&#'%#$D&(
#. $ntroduccin ......................................................................................................... % &. Creacin de tablas ............................................................................................... % &.#. $nte!ridad de datos ...................................................................................... ' &.&. (estricciones sobre una tabla ...................................................................... ) &.%. (estricciones !enerales .............................................................................. ## &.'. *istas del diccionario de datos para las restricciones ............................... #& &.). Creacin de una tabla con datos recuperados en una consulta ................ #% %. +upresin de tablas ........................................................................................... #' %.#. Orden ,(-.C/,0 .................................................................................... #' '. Modificacin de tablas ....................................................................................... #) '.#. /dicin1 modificacin o eliminacin de columnas de una tabla ................ #) '.&. /dicin1 borrado y renombrado de restricciones ....................................... #2 '.%. /ctivado y desactivado de restricciones .................................................... #3 ). *istas ................................................................................................................. #3 ).#. Creacin y uso de vistas sencillas .............................................................. #4 ).&. Consulta de vistas creadas ........................................................................ #4 ).%. Creacin y uso de vistas con 5$,6 C60C7 O8,$O. y (0/D O.L9 .... #4 ).'. Creacin y uso de vistas complejas ............................................................ &: ).). Borrado de vistas ....................................................................................... &# 2. +innimos........................................................................................................... &# 2.#. Creacin de sinnimos ............................................................................... &# 2.&. Borrado de sinnimos ................................................................................ && 2.%. Consulta de sinnimos ............................................................................... && ;. Cambios de nombre ........................................................................................... && 3. Biblio!rafa ........................................................................................................ &%
-D3 < Creacin1 modificacin y supresin de tablas y vistas
% = &%
)* $ntroduccin -na ve> vista la introduccin al len!uaje +?L y los tipos existentes en Oracle1 es @ora de empe>ar a usar el len!uaje de descripcin de datos o DDL AData Definition LanguageB. -tili>aremos1 fundamentalmente1 tres rdenes: C(0/,01 D(O8 y /L,0(. La orden C+%,'% sirve para crear objetos en la bases de datos Atablas1 vistas1 sinnimos1 etc.B. La orden D+&! permite eliminar un objeto. Mediante la orden ,-'%+ se puede modificar un objeto de la BD. Cuando definamos una nueva tabla1 no slo aCadiremos columnas con un determinado tipo de datos1 serD necesario Eue aCadamos las restricciones necesarias definidas en el modelo relacional. 0n caso contrario1 podemos encontrarnos con problemas de inte!ridad. $ma!inemos Eue tenemos dos tablas una de Artculos y otra de Ventas. +i no aCadimos las restricciones necesarias podra ocurrir Eue introdujFramos una fila en la tabla de ventas Eue @iciera alusin a un producto Eue no existe. .* Creacin de tablas /ntes de crear una tabla1 es necesario planificar ciertos aspectos: o %l nombre de la tabla* Debe ser un nombre Eue identifiEue su contenido. +i partimos de un diseCo relacional1 el nombre de la tabla debera de ser el nombre de la relacin. .o puede tener una lon!itud mayor a %: caracteres1 no puede ser una palabra reservada de Oracle y el primer carDcter debe ser alfabFtico Ael resto pueden ser letras1 nGmeros y el carDcter de subrayadoB o %l nombre de cada columna* 6a de ser autodescriptivo. +i partimos de un diseCo relacional1 ya dispondremos del nombre adecuado de cada columna. o %l tipo de dato de cada columna* Debe ser uno de los tipos permitidos por Oracle. +i en el diseCo relacional no nos @an proporcionado informacin1 tendremos Eue ele!irlo nosotros. 0s conveniente dedicar al!o de tiempo a pensar bien el tipo y tamaCo de cada columna. o +estricciones* 0starDn indicadas en el diseCo relacional. +in embar!o1 es posible Eue resulte interesante pensar en si resulta conveniente Eue ciertas columnas ten!an al!Gn valor por defecto. 8ara crear una tabla utili>aremos la orden C(0/,0 ,/BL01 cuyo formato mDs simple es: CREATE TABLE nom_tabla ( nom_col1 tipo [NOT NULL], nom_col2 tipo [NOT NULL],
nom_colN tipo [NOT NULL] ) [TABLESPACE nom_espacio]; Donde: o nomHtabla: 0s el nombre de la tabla. Debe ser Gnico dentro de un mismo ,/BL0+8/C0. o nomHcol#: 0s el nombre de la columna #. Lo mismo aplica con el nombre del resto de columnas. Debe ser Gnico dentro de una misma tabla. La Gltima columna no lleva una coma al final. -D3 < Creacin1 modificacin y supresin de tablas y vistas
' = &%
o tipo: es cualEuiera de los tipos vDlidos de Oracle. Los mDs importantes se vieron en la unidad anterior. o I J: ,odo lo Eue vaya entre corc@etes indica Eue es opcional. o .O, .-LL: 0s una restriccin Eue impide Eue el valor de una columna sea nulo. o ,/BL0+8/C0: +irve para indicar la ubicacin l!ica de la tabla. 0sto es as para poder a!rupar las tablas de manera l!ica y Eue no se encuentren todas en un mismo lu!ar1 evitando ries!os innecesarios. Como cada usuario tiene definido un ,/BL0+8/C0 asi!nado1 no es necesaria su utili>acin1 a menos Eue Eueremos !uardar una tabla fuera de nuestro espacio de nombres. %/emplo ): CREATE TABLE Alumnos ( num_mat NUMBER(6) NOT NULL, nombre VARCHAR2(15) NOT NULL, fecha_nac DATE, direccion VARCHAR2(30), localidad VARCHAR2(15) ); #ota ): Como se puede observar1 se @an utili>ado las mayGsculas para las palabras reservadas de Oracle AclDusulas1 tipos y restriccionesB mientras Eue se @an usado minGsculas para describir la informacin introducida por el usuario. 0sto es as por cuestiones de le!ibilidad. +in embar!o1 @ay Eue tener en cuenta Eue Oracle .O @ace distincin entre mayGsculas y minGsculas Asalvo cuando un texto va entre comillas simplesB. #ota .: /unEue Oracle lo soporta1 no se recomienda utili>ar acentos ni caracteres especiales a la @ora de identificar el nombre de un objeto Atabla1 columna1 restriccin1 etc.B para evitar futuros problemas a la @ora de referenciarlos. Los usuarios pueden consultar las tablas creadas por medio de la vista U(%+0',B-%(. 0sta vista contiene informacin acerca de las tablas Eue son propiedad del usuario: nombre de la tabla1 nombre del tablespace1 nGmero de filas1 etc. 8or ejemplo1 si Eueremos averi!uar el nombre de las tablas creadas @abra Eue escribir la orden: SELECT table_name FROM USER_TABLES; (slo muestra los nombres) SELECT * FROM USER_TABLES; (muestra cierta informacin de cada tabla) 0xisten otras dos vistas Eue permiten obtener informacin de los objetos Eue son propiedad del usuario: o U(%+0&B1%C'(: Describe todos los objetos Eue pertenecen al usuario actual. o U(%+0C,',-&2: Lista los ndices1 tablas1 vistas1 clGsteres1 sinnimos y secuencias pertenecientes al usuario actual. .*)* $nte3ridad de datos La inte3ridad @ace referencia al @ec@o Eue los daos de la BD @an de ajustarse a una serie de restricciones antes de almacenarse en ella. /s pues1 una restriccin de inte3ridad serD una re!la Eue restrin!e el ran!o de valores para una o mDs columnas de una tabla. -D3 < Creacin1 modificacin y supresin de tablas y vistas
) = &%
+i el valor introducido o cambiado por el usuario viola al!una de las restricciones impuestas1 la base de datos tiene la capacidad de des@acer o cancelar los cambios. 0xiste otro tipo de inte!ridad llamada inte3ridad referencial1 la cual !aranti>a Eue los valores de una columna=s Aclave ajenaB de unta tabla dependan de los valores de otra columna=s Aclave primariaB de otra tabla. +i en el ejemplo comentado en la introduccin referente a las tablas Artculos y Ventas se define inte!ridad referencia para las tablas1 nunca se darD la situacin de insertar una venta con un artculo inexistente. 0l conjunto de posibles restricciones se explica a continuacin. .*.* +estricciones sobre una tabla La orden C(0/,0 ,/BL0 permite definir distintos tipos de restricciones sobre una tabla: claves primarias1 claves ajenas1 obli!atoriedad1 valores por defecto1 unicidad y verificacin de condiciones. 8ara definir las restricciones en la orden C(0/,0 ,/BL0 usaremos la clDusula C&#('+,$#'. Ksta puede aplicarse sobre una sola columna Arestriccin de columnaB o sobre un !rupo de columnas Arestriccin de tablaB. Cuando se define una restriccin sobre una columna1 la clDusula CO.+,(/$., puede estar incluida en la propia definicin de la columna1 o al final de la definicin de la tabla. Las restricciones Eue afectan a mDs de una columna tienen Eue aCadirse1 obli!atoriamente1 al final de la definicin de la tabla. / continuacin se muestra la sintaxis de C(0/,0 ,/BL0 con las restricciones de columna y tabla: CREATE TABLE nom_tabla ( Definicin_columna,
Definicin_restriccin:= [CONSTRAINT nom_restriccin] [{ UNIQUE (nom_col1[,nom_col2]) | PRIMARY KEY (nom_col1[,nom_col2]) | FOREIGN KEY (nom_col1[, nom_col2]) REFERENCES nom_tabla[(nom_col1[,nom_col2])][ON DELETE CASCADE]] | CHECK (condicin) }] Donde: o Definicin_columna describe la sintaxis para definir una columna cualEuiera. o Definicin_restriccin describe la sintaxis para definir una restriccin de tabla. -D3 < Creacin1 modificacin y supresin de tablas y vistas
2 = &%
o L M N Lo Eue va entre llaves indica seleccin. 0s decir1 se @a de seleccionar una de las opciones Eue @ay separadas por la lnea vertical. %/emplo .: CREATE TABLE Provincias ( codigo NUMBER(2) PRIMARY KEY, nombre VARCHAR2(25) );
CREATE TABLE Empleado ( nombre VARCHAR2(25) PRIMARY KEY, edad NUMBER CHECK (edad BETWEEN 18 AND 35), cod_prov NUMBER(2) REFERENCES Provincias ON DELETE CASCADE );
La tabla empleado @ace referencia a la tabla provincias ya Eue la columna cod_prov es una clave ajena. Las restricciones las podamos @aber aCadido como restricciones de tabla con o sin nombre: Opcin & CREATE TABLE Empleado ( nombre VARCHAR2(25), edad NUMBER, cod_prov NUMBER(2), CONSTRAINT pk_empleado PRIMARY KEY(nombre), CONSTRAINT ck_edad CHECK(edad BETWEEN 18 AND 35), CONSTRAINT fk_empleado FOREIGN KEY(cod_prov) REFERENCES Provincia ON DELETE CASCADE ); Opcin % CREATE TABLE Empleado ( nombre VARCHAR2(25), edad NUMBER, cod_prov NUMBER(2), PRIMARY KEY(nombre), CHECK(edad BETWEEN 18 AND 35), FOREIGN KEY(cod_prov) REFERENCES Provincia ON DELETE CASCADE ); La ventaja de darle nombre a las restricciones es Eue lue!o podemos manipularlas con facilidad. 8ese a Eue la mayora de las restricciones posibles ya se @an estudiado en el modelo relacional1 a continuacin va a explicarse cada una de ellas con mDs detalle. aB Clave 8rimaria: 8($M/(9 709 -na clae primaria de una tabla es una columna o un conjunto de ellas Eue identifican unvocamente a cada fila. Debe ser Gnica y no nula. Como mDximo podemos definir una clave primaria por tabla. .o @ay problema Eue la clave estF compuesta por columnas Eue1 a su ve>1 sean claves ajenas. Lo Gnica consideracin a tener en cuenta es Eue si la clave primaria estD compuesta por mDs de una -D3 < Creacin1 modificacin y supresin de tablas y vistas
; = &%
columna entonces deberD definirse con una restriccin de tabla1 no como restriccin de columna. Definicin_columna:= nom_col tipo [CONSTRAINT nom_restriccin] PRIMARY KEY Definicin_restriccin:= [CONSTRAINT nom_restriccin] PRIMARY KEY (nom_col1[,nom_col2]) 0s conveniente saber Eue1 cuando se crea una clave primaria1 automDticamente se crea un ndice Eue facilita el acceso a los datos de la tabla. %/emplo 3: / continuacin vamos a transformar el si!uiente modelo relacional: OonasAcodH>ona: d_cod_zona1 nombre: d_nombre1 descripcin: d_descB C8: LcodH>onaN *..: LnombreN 8ropietariosAcalle: d_calle1 num: d_entero piso: d_ entero1 pta: d_pta1 cp: d_cp1 metros: d_metros1 comentarios: d_comentarios1 codH>ona: d_cod_zona1 propietario: d_dniB C8: Lcalle1 num1 piso1 puertaN *..: LpropietarioN C/: LcodH>onaN Oonas Dominios: dHcodH>ona: enteroA&B == Las >onas se identifican por un entero & d!itos max. dHnombre: cadenaA&:B dHdesc: cadenaA):B dHcalle: cadenaA%:B dH entero: entero dHpta: cadenaA&B == 8odra ocurrir Eue una puerta fuera nGmeros o letras. dHcp: enteroA)B == Los cdi!o postales tienen un mDximo de ) d!itos. dHmetros: entero dHcomentarios: cadenaA2:B dHdni: cadenaA#:B
CREATE TABLE Zonas ( cod_zona NUMBER(2) PRIMARY KEY, nombre VARCHAR2(20) NOT NULL, "descripcin" VARCHAR2(50) ); CREATE TABLE Propietarios ( calle VARCHAR2(30), num NUMBER(3), /* Asumimos que num <=999 */ piso NUMBER(2), /* Asumimos que piso <= 99 */ pta CHAR(2), cp NUMBER(5), metros NUMBER, comentarios VARCHAR(60), cod_zona NUMBER(2) REFERENCES Zonas, propietario CHAR(10) NOT NULL, /* DNI del propietario */ CONSTRAINT pk_propietarios PRIMARY KEY(calle, num, piso, pta) ); -D3 < Creacin1 modificacin y supresin de tablas y vistas
3 = &%
Como se puede observar1 la clave primaria de la tabla 8ropietarios @a tenido Eue aCadirse como una restriccin de tabla ya Eue estD compuesta por mDs de una columna. /demDs1 se @a restrin!ido un poco mDs los valores del dominio d_entero para a@orrar al!o de espacio en disco ya Eue asumimos Eue el nGmero de un edificio no serD nunca un valor superior a 4441 i!ual Eue los pisos1 en 0spaCa no @ay edificios con mDs de 44 pisos. Lue!o en el primer caso con % d!itos tenemos suficiente y en el se!undo con &. #ota: Oracle no ofrece nin!una orden para la creacin de dominios Apese a estar en el estDndar +?LB. 8ermite crear tipos nuevos pero1 al ser objetos y no tipos de datos1 no resultan tan cmodos de manejar. bB Clave /jena: PO(0$G. 709 -na clave ajena estD formada por una o varias columnas Eue estDn asociadas a una clave primaria de otra o de la misma tabla. +e pueden definir tantas claves ajenas como sea preciso1 y pueden estar o no en la misma tabla Eue la clave primaria a la Eue @acen referencia. 0l valor de una clave ajena slo puede ser .-LL o uno de los valores de la clave referenciada. /l i!ual Eue antes1 una restriccin de clave ajena se puede declarar como restriccin de columna o de tabla. Cuando una clave ajena estF compuesta por mDs de una columna1 serD necesario definirla como restriccin de tabla. (ecordemos su sintaxis para lue!o anali>ar sus distintas clDusulas: Definicin_columna:= nom_col tipo [CONSTRAINT nom_restriccin] REFERENCES nom_tabla [(nom_col1[,nom_col2]) [ON DELETE CASCADE]]
Definicin_restriccin:= [CONSTRAINT nom_restriccin] FOREIGN KEY (nom_col1[, nom_col2]) REFERENCES nom_tabla[(nom_col1[,nom_col2])[ON DELETE CASCADE]] Cuando la clave ajena se define como restriccin de tabla1 es obli!atorio poner la clDusula F&+%$2# 4%5 indicando las columnas Eue componen la tabla ajena. 0n la clDusula +%F%+%#C%( indicamos la tabla a la Eue @ace referencia la clave ajena. .o es necesario indicar las columnas a las Eue se @ace referencia siempre y cuando las columnas Eue forman la clave ajena estFn en el mismo orden Eue la clave primaria a la Eue @acen referencia y ten!an los mismos tipos: %/emplo 6: CREATE TABLE Coche ( marca CHAR(10), modelo VARCHAR2(20), color VARCHAR2(15), PRIMARY KEY (marca, modelo, color) ); CREATE TABLE Persona ( dni CHAR(10) PRIMARY KEY, nombre VARCHAR2(20), apellidos VARCHAR2(50) ); CREATE TABLE Propietario ( marca_c CHAR(10), -D3 < Creacin1 modificacin y supresin de tablas y vistas
4 = &%
modelo_c VARCHAR2(20), color_c VARCHAR2(15), dni_p CHAR(10), PRIMARY KEY (dni_p, color_c, modelo_c, marca_c), FOREIGN KEY (dni_p) REFERENCES Persona, FOREIGN KEY (modelo_c, marca_c, color_c) REFERENCES Coche ); +i tratamos de ejecutar lo anterior obtendramos el si!uiente error: Error en la lnea de comandos:25 Columna:15 Informe de error: Error SQL: ORA-02267: tipo de columna incompatible con tipo de columna a la que se hace referencia 0l problema reside en Eue las columnas Eue forman parte de la clave ajena de la lnea en ne!rita tienen Eue tener los mismos tipos Eue las columnas de la clave primaria a las Eue @acen referencia. /l no colocar las columnas en el orden correcto1 no coinciden los tipos. 8ara Eue fuera correcto @abra Eue cambiar la lnea remarcada por cualEuier de las dos opciones si!uientes: FOREIGN KEY (marca_c, modelo_c, color_c) REFERENCES Coche FOREIGN KEY (modelo_c, marca_c, color_c) REFERENCES Coche (modelo, marca, color) #ota: 0n caso Eue todas las columnas ten!an el mismo tipo Atanto las columnas de la C8 como las de la C/B1 es de vital importancia Eue1 al definir la clave ajena1 se coloEuen las columnas en el orden adecuado o se indiEue1 para cada columna de la C/1 la columna de la clave primaria a la Eue @ace referencia. +i se @ace incorrectamente Oracle .O darD error ya Eue los tipos son compatibles1 pero estaremos introduciendo una restriccin incorrecta la cual nos darD problemas en el futuro. La clDusula &# D%-%'% C,(C,D%, o borrado en cascada1 se define cuando se desea Eue al borrar las filas asociadas con claves primarias1 deseamos Eue se eliminen automDticamente las filas con claves ajenas Eue referencien a dic@as claves. %/emplo 7: 8artiendo del esEuema +?L del ejemplo '1 ima!inemos Eue se @an aCadido a todas las claves ajenas el borrado el cascada. +upon!amos1 ademDs1 Eue las tablas se @an rellenado con los si!uientes datos: 8ersona dni .om apell ##Q Rose LujDn &&B 8aco Lo>ano %%O Mar +oler 8ropietario dniHp marcaHc modeloHc colorHc ##Q /udi /' Blanco ##Q /udi ?) .e!ro &&B Pord Pocus />ul Coc@e marca modelo color /udi /' Blanco Pord Pocus />ul /udi ?) .e!ro +i borrDsemos la persona cuyo dni es ##Q se borraran1 de manera automDtica1 las dos primeras filas Eue componen la tabla Propietario. +i borrDsemos la persona con dni &&B1 slo se borrara la tercera fila. 0n cambio1 si borramos la persona con dni %%O1 la tabla Propietario no se vera afectada. De un modo anDlo!o sucedera al borrar elementos de la tabla Coche. 0s importante tener en cuenta Eue1 en el caso de no poner la clDusula O. D0L,0 C/+C/D01 si tratDsemos de borrar a las personas cuyo dni fuera ##Q o &&B no podramos ya Eue estDn siendo referenciadas por filas de otra tabla cuyas claves ajenas coinciden con dic@os valores. Lo mismo ocurrira si tratDramos de borrar1 directamente1 la tabla Persona. 0n estos casos1 es necesario borrar primero -D3 < Creacin1 modificacin y supresin de tablas y vistas
#: = &%
las filas Eue @acen referencia a dic@os valores. 8or ejemplo1 si Eueremos eliminar de la tabla Persona la fila cuyo dni es ##Q antes @ay Eue borrar las dos filas Eue la tabla Propietario Eue le @acen referencia. cB Obli!atoriedad: .O, .-LL Como era de esperar1 la restriccin .O, .-LL obli!a a la columna afectada a tener un valor no nulo1 es decir1 Eue cada ve> Eue se aCada una nueva fila a la tabla1 el usuario tiene Eue asi!nar un valor determinado a dic@a columna. La restriccin de obli!atoriedad slo puede especificarse como restriccin de columna1 no de tabla. Definicin_columna:= nom_col tipo [CONSTRAINT nom_restriccin] NOT NULL dB *alores por defecto: D0P/-L, La clDusula D0P/-L, permite asi!nar valores por defecto a las columnas afectadas. /s1 si el usuario al crear una nueva fila no indica nin!Gn valor para dic@a columna1 se asi!na un valor por defecto. La restriccin de valor por defecto slo puede especificarse como restriccin de columna1 no de tabla. Definicin_columna:= nom_col tipo [CONSTRAINT nom_restric] DEFAULT valor 0n la especificacin D0P/-L, es posible incluir no slo constantes1 sino funciones +?L y las variables -$D y +9+D/,0. +in embar!o1 no se puede @acer referencias a columnas o a funciones 8L=+?L. %/emplo 8: CREATE TABLE Venta ( dni VARCHAR2(10), matricula CHAR(7), fecha DATE DEFAULT SYSDATE, PRIMARY KEY(dni, matricula) ); Cada nueva fila indicarD una venta de un coc@e. +i el usuario no introduce la fec@a de venta1 se introducirD como fec@a el aCo=da=@ora en la Eue se reali> la insercin en la tabla. eB -nicidad: -.$?-0 Con esta restriccin evitamos Eue dos filas distintas repitan el valor de una misma columna. 8uede contener una o varias columnas. /dmite valores .-LL. /l i!ual Eue en 8($M/(9 7091 cuando se define una restriccin -.$?-0 se crea un ndice automDticamente. (ecordemos Eue puede definirse tanto como restriccin de columna como de tabla: Definicin_columna:= nom_col tipo [CONSTRAINT nom_restriccin] UNIQUE
Definicin_restriccin:= [CONSTRAINT nom_restriccin] UNIQUE (nom_col1[,nom_col2]) -D3 < Creacin1 modificacin y supresin de tablas y vistas
## = &%
fB *erificacin de condiciones: C60C7 Muc@as columnas de las tablas reEuieren valores limitados dentro de un ran!o o el cumplimiento de ciertas condiciones. / travFs de la restriccin C60C7 se puede expresar una condicin Eue @a de cumplirse para todas y cada una de las filas de la tabla. La restriccin C60C7 puede @acer referencia a una o mDs columnas1 pero no a valores de otras filas. /demDs1 dentro de la condicin1 no pueden aparecer subconsultas ni acceso a las variables +9+D/,01 -$D y -+0(. /l i!ual Eue con otros tipos de restricciones1 la restriccin C60C7 puede definirse sobre una columna o sobre una tabla: Definicin_columna:= nom_col tipo [CONSTRAINT nom_restriccin] CHECK(condicin)
Definicin_restriccin:= [CONSTRAINT nom_restriccin] CHECK(condicin) %/emplo 9: $ma!inemos Eue tenemos Eue tenemos el si!uiente diseCo relacional: 0studianteAdni: d_dni1 nombre: d_nombre1 edad: d_edad1 curso: d_cursoB C8: LdniN *..: LnombreN Dominios: dHdni: cadenaA#:B dHnombre: cadenaA%:B Adebe de estar escrita en mayGsculasB dHedad: enteroI)1 &:J dHcurso: #1 & % +i lo traducimos al +?L de Oracle usando restricciones de tabla: CREATE TABLE Estudiante ( dni VARCHAR(10), nombre VARCHAR(30) NOT NULL, edad NUMBER(2), curso NUMBER(1), CONSTRAINT pk_estudiante PRIMARY KEY(dni), CONSTRAINT edad_valida CHECK(edad BETWEEN 5 AND 20), CONSTRAINT curso_valido CHECK(curso IN(1,2,3)), CONSTRAINT nombre_mayus CHECK(UPPER(nombre) = nombre) ); Otra posibilidad eEuivalente a la anterior sera la si!uiente: CREATE TABLE Estudiante ( dni VARCHAR(10) PRIMARY KEY, nombre VARCHAR(30) NOT NULL CHECK(UPPER(nombre) = nombre), edad NUMBER(2) CHECK(edad BETWEEN 5 AND 20), curso NUMBER(1) CHECK(curso IN(1,2,3)) ); .*3* +estricciones 3enerales 0n la UD ! "ransformacin del modelo #$ al modelo relacional1 anticipamos cmo expresar en +?L aEuellas restricciones Eue no pudieran expresarse mediante -D3 < Creacin1 modificacin y supresin de tablas y vistas
#& = &%
las restricciones del modelo relacional. Concretamente1 vimos la clDusula C(0/,0 /++0(,$O. la cual permita indicar EuF condicin o condiciones deban cumplirse siempre sobre una o varias tablas. +in embar!o1 pese a Eue dic@a clDusula estD presente en el estDndar +?L desde la versin +?LS4&1 no @ay prDcticamente nin!Gn +GBD Eue lo soporte y Oracle no es una excepcin. ?ue Oracle no permita definir restricciones !enerales mediante dic@a clDusula no si!nifica Eue no ofre>ca otros mecanismos para ello. Muc@os +GBD1 como Oracle1 implementan disparadores AtriggersB los cuales permiten reali>ar acciones antes y=o despuFs de Eue se vayan a @acer cambios sobre ciertas tablas. Dic@as acciones pueden ser la cancelacin de los cambios si no se cumplen ciertas condiciones1 reali>ar un conjunto de acciones adicionales antes=despuFs de los cambios o reali>ar ciertas acciones en lu!ar de los cambios Eue se fueran a reali>ar. 8ara poder utili>ar disparadores es necesario @aber visto previamente la construccin de !uiones a travFs del len!uaje 8L=+?L. .*6* :istas del diccionario de datos para las restricciones 0xisten una serie de vistas creadas por Oracle Eue contienen informacin referente a las restricciones definidas en las tablas. Contienen informacin !eneral las si!uientes: o USER_CONSTRAINTS: muestra las definiciones de restricciones de tablas propiedad del usuario. o ALL_CONSTRAINTS: muestra las definiciones de restricciones de las tablas a las Eue puede acceder el usuario. o DBA_CONSTRAINTS: muestra todas las definiciones de restricciones sobre todas las tablas. La columna CONSTRAINT_TYPE de las vistas anteriores puede ser: o C: (estriccin C60C7 o P: (estriccin 8($M/(9 709 o R: (estriccin PO(0$G. 709 o U: (estriccin -.$?-0 +i Eueremos informacin sobre restricciones definidas en las columnas tenemos: o USER_CONS_COLUMNS: describe todas las restricciones de columnas en tablas propiedad del usuario. o ALL_CONS_COLUMNS: describe todas las restricciones de columnas en tablas accesibles por el usuario. o DBA_CONS_COLUMNS: describe todas las columnas en la base de datos Eue tienen una restriccin especificada. %/emplo 8 +i Eueremos conocer todas las restricciones definidas en tablas de nuestra propiedad1 basta con @acer: SELECT * FROM USER_CONSTRAINTS; -D3 < Creacin1 modificacin y supresin de tablas y vistas
#% = &%
+i en cambio Eueremos conocer las restricciones definidas sobre una tabla de nuestra propiedad en concreto1 entonces tendremos Eue @acer: SELECT * FROM USER_CONSTRAINTS WHERE table_name = 'NOM_TABLA'; Lo mismo aplica con las vistas Eue muestran las restricciones de columna. .*7* Creacin de una tabla con datos recuperados en una consulta La sentencia C(0/,0 ,/BL0 permite crear una tabla a partir de la consulta de otra tabla ya existente. La nueva tabla contendrD los datos obtenidos en la consulta. +e lleva a cabo esta accin con la clDusula /+ colocada al final de la orden C(0/,0 ,/BL0. 0l formato es el Eue si!ue: CREATE TABLE nom_tabla ( [nom_col1 [, nom_col2]] /* sirve para renombrar columnas */ ) [TABLESPACE nom_espacio> AS consulta; .o es necesario especificar tipos ni tamaCo de las columnas ya Eue vienen determinados por los tipos y los tamaCos recuperados en la consulta. La consulta puede contener una subconsulta1 una combinacin de tablas o cualEuier sentencia +0L0C, vDlida. +lo se copiaran las restriccin .O, .-LL1 el resto se obviarDn. %/emplo ;: $ma!inemos Eue tenemos la si!uiente tabla creada: CREATE TABLE Trabajadores ( cod_trab NUMBER PRIMARY KEY, dni VARCHAR2(10), nombre VARCHAR2(20) NOT NULL, apellidos VARCHAR2(40) CONSTRAINT nn_apell NOT NULL, dpto CHAR(5), UNIQUE (dni) ); +i Eueremos @acer una copia de toda la tabla @aramos: CREATE TABLE Trabajadores_Copia AS SELECT * FROM Trabajadores; 0n cambio1 si Eueremos crear una nueva tabla pero Eue slo conten!a aEuellos empleados pertenecientes a un cierto departamento1 entonces @aramos: CREATE TABLE Trabajadores_Inf AS SELECT * FROM Trabajadores WHERE dpto='INF'; +i consultamos las restricciones de la tabla "raba%adores vemos las ' restricciones: dos de tipo C60C7 Anot nullB1 una de tipo 8($M/(9 709 y otra de tipo -.$?-0. SELECT constraint_name, constraint_type, search_condition FROM USER_CONSTRAINTS WHERE table_name='TRABAJADORES';
0n cambio1 si consultamos las restricciones de cualEuier de las dos nuevas tablas1 slo encontraremos las dos restricciones C60C7 Anot nullB. SELECT constraint_name, constraint_type, search_condition FROM USER_CONSTRAINTS WHERE TABLE_NAME='TRABAJADORES_INF'; -D3 < Creacin1 modificacin y supresin de tablas y vistas
#' = &%
3* (upresin de tablas La orden D(O8 ,/BL0 suprime una tabla de la base de datos. Cada usuario puede borrar sus propias tablas1 slo el administrador de la base de datos o al!Gn usuario con el privile!io D(O8 /.9 ,/BL0 puede borrar las tablas de otro usuario. /l suprimir una tabla tambiFn se suprimen los ndices y los privile!ios asociados a ella. Las vistas y los sinnimos creados a partir de esta tabla dejan de funcionar1 pero si!uen existiendo en la base de datos1 por lo Eue @abra Eue eliminarlos. 0l formato de la orden D(O8, ,/BL0 es: DROP TABLE [usuario.]nom_tabla [CASCADE CONSTRAINTS] 8ara borrar nuestras tablas no es necesario poner nuestro nombre1 se!uido de un punto1 delante del nombre de la tabla. +in embar!o1 si Eueremos borrar la tabla de otro usuario serD necesario indicar el usuario al Eue pertenece la tabla a eliminar. Obviamente slo podremos reali>ar el borrado si disponemos de los permisos adecuados. C/+C/D0 CO.+,(/$.,+ elimina las restricciones de inte!ridad referencia Eue remitan a la clave primaria de la tabla borrada. +i no se pone y @ay al!una clave ajena Eue apunta a la clave primaria de la tabla a borrar1 el borrado de la tabla darD error. %/emplo )<: +i @acemos un poco de memoria1 en el 0jemplo & @abamos creado dos tablas: una con 8rovincias y otra con 0mpleados. +i suponemos Eue se @a aCadido al!Gn empleado asi!nDndole un cdi!o de provincia y tratamos de borrarla nos encontraremos con el si!uiente error: DROP TABLE Provincias; Informe de error: Error SQL: ORA-02449: claves nicas/primarias en la tabla referidas por claves ajenas 0n cambio si usamos la orden de borrado diciendo Eue borre las restricciones en cascada1 entonces no tendremos nin!Gn problema: DROP TABLE Provincias CASCADE CONSTRAINTS; 3*)* &rden '+U#C,'% 8ermite suprimir todas las filas de una tabla y liberar el espacio ocupado para otros usos sin Eue desapare>ca la definicin de la tabla de la base de datos. 0s una orden del len!uaje de definicin de datos Eue no !enera informacin de retroces A(OLLB/C7B1 es decir1 Eue una sentencia ,(-.C/,0 no se puede anular. ,ampoco activa disparadores D0L0,0. Gracias a esto1 el borrado de filas con la orden ,(-.C/,0 es mDs rDpido Eue con D0L0,0 Ase verD mDs adelanteB. +u formato es el si!uiente: TRUNCATE TABLE [usuario.]nom_tabla [{DROP | REUSE} STORAGE] %/emplo )): TRUNCATE TABLE Trabajadores; -D3 < Creacin1 modificacin y supresin de tablas y vistas
#) = &%
8or defecto1 ,(-.C/,0 liberar todo el espacio de las filas borradas Aexcepto el especificado mediante un parDmetro de la tabla llamado M$.0Q,0.,+B1 es el eEuivalente a aCadir D(O8 +,O(/G0. +in embar!o1 es posible decirse al sistema Eue no libere dic@o espacio aCadiendo al final (0-+0 +,O(/G0. /demDs1 no se puede truncar una tabla cuya clave primaria sea referenciada por la clave ajena de otra tabla. /ntes de truncar la tabla o bien @ay Eue desactivar la restriccin de clave ajena o borrar todos los elementos cuya clave ajena @a!a referencia a elementos de la tabla a borrar. 6* =odificacin de tablas +e puede modificar una tabla mediante la orden /L,0( ,/BL0. La modificacin de tablas nos permitirD: aCadir1 modificar o eliminar columnas de una tabla existente1 aCadir o eliminar restricciones y activar o desactivar restricciones. ALTER TABLE nom_tabla { ADD (Definicin_columna [, Definicin_columna]) | MODIFY (Definicin_columna [, Definicin_columna]) | DROP {COLUMN nom_col | (nom_col1 [, nom_col2])} | ADD CONSTRAINT Definicin_restriccin | DROP CONSTRAINT nom_restriccin | RENAME CONSTRAINT nom_antiguo TO nom_nuevo | DISABLE CONSTRAINT nom_restriccin | ENABLE CONSTRAINT nom_restriccin }; 6*)* ,dicin, modificacin o eliminacin de columnas de una tabla *eamos a continuacin cmo se usa la orden /L,0( ,/BL0 para aCadir1 modificar o eliminar columnas de una tabla. aB /DD 8ermite aCadir una o varias columnas a la tabla. +in embar!o1 a la @ora de aCadir una nueva columna @ay Eue tener en cuenta varios factores: o +i la nueva columna no tiene la restriccin .O, .-LL1 entonces puede aCadirse en cualEuier momento. o +i la nueva columna s tiene la restriccin .O, .-LL1 entonces o bien @ay Eue aCadir la columna antes de aCadir filas a la tabla o serD necesario se!uir estos tres pasos: #. /Cadir la columna sin la restriccin .O, .-LL. &. Dar valor a la nueva columna para cada una de las filas. %. Modificar la columna para aCadirle la restriccin .O, .-LL. ALTER TABLE nom_tabla ADD (Definicin_columna [, Definicin_columna]); %/emplo ).: +i Eueremos aCadir a la tabla ,rabajadores del %/emplo ; una nueva columna llamada fecha_alta para indicar cuando fue dado de alta el trabajador: ALTER TABLE Trabajadores ADD (fecha_alta DATE); bB MOD$P9 Modifica una o mDs columnas existentes en la tabla. /l modificar una columna de una tabla @ay Eue tener en cuenta las si!uientes consideraciones: -D3 < Creacin1 modificacin y supresin de tablas y vistas
#2 = &%
o +e puede incrementar el tamaCo de una columna en cualEuier momento Apor ejemplo pasar de C6/(A#)B a C6/(A&:BB. o /l disminuir la lon!itud de una columna Eue tiene datos no se puede dar menor tamaCo Eue el necesario para almacenar el mDximo valor almacenado. o 0s posible aumentar o disminuir el nGmero de posiciones decimales en una columna de tipo .-MB0(. o +i todas las filas de la tabla tienen el valor .-LL para una columna1 podemos @acer cualEuier tipo de modificacin sobre dic@a columna: cambiar el tipo de datos1 reducir su tamaCo1 etc. o /Cadir la restriccin .O, .-LL sobre una columna slo serD posible si dic@a columna no es nula para todas las filas de la tabla. ALTER TABLE nom_tabla MODIFY (Definicin_columna [, Definicin_columna]); %/emplo )3: *amos a incrementar el tamaCo de las columnas nombre y apellidos de la tabla "raba%adores: ALTER TABLE Trabajadores MODIFY (nombre VARCHAR2(30), apellidos VARCHAR2(50)); #ota: Las restricciones Eue tuvieran las columnas nombre y apellidos no se ven alteradas por la instruccin anterior. 8odemos comprobarlo ejecutando antes y despuFs de la modificacin la si!uiente instruccin: SELECT * FROM USER_CONSTRAINTS WHERE table_name='TRABAJADORES'; cB D(O8 +e utili>a para borrar una columna de una tabla. 6ay Eue tener en cuenta Eue no se pueden borrar todas las columnas de una tabla y tampoco se pueden eliminar claves primarias referenciadas por claves ajenas. ALTER TABLE nom_tabla DROP {COLUMN nom_col | (nom_col1 [, nom_col2])}; %/emplo )6: 8ara borrar el atributo fecha_alta de la tabla "raba%adores del %/emplo ; @aramos: ALTER TABLE nom_tabla DROP COLUMN fecha_alta; ,ambiFn @abra valido @acer: ALTER TABLE nom_tabla DROP (fecha_alta); 6*.* ,dicin, borrado y renombrado de restricciones 8odemos aCadir y eliminar las si!uientes restricciones de una tabla: -.$?-01 8($M/(9 7091 PO(0$G. 709 y C60C7. ,ambiFn podemos cambiar el nombre de cualEuier restriccin. #ota: 0xiste otra operacin llamada MOD$P9 sobre las restricciones la cual no vamos a ver pero Eue permite cambiar el estado de una restriccin mDs allD de simplemente des@abilitarla o @abilitarla. -D3 < Creacin1 modificacin y supresin de tablas y vistas
#; = &%
aB /DD CO.+,(/$., 8ara aCadir una nueva restriccin usamos la orden: ALTER TABLE nom_tabla ADD CONSTRAINT Definicin_restriccin; %/emplo )6: +i Eueremos aCadir sobre la tabla "raba%adores definida en el %/emplo ; la restriccin Eue di!a Eue todo nombre debe estar escrito en mayGsculas @aramos: ALTER TABLE Trabajadores ADD CONSTRAINT nom_mayus CHECK(nombre = UPPER(nombre)); bB D(O8 CO.+,(/$., 8ara la eliminacin de restricciones se utili>a la orden: ALTER TABLE Trabajadores DROP CONSTRAINT nom_restriccin; +e pueden borrar tanto las restricciones cuyo nombre le @emos asi!nado nosotros1 como aEuellas restricciones nombradas por el sistema. 8ara obtener el nombre de todas las restricciones de una tabla podemos ejecutar la si!uiente orden: SELECT * FROM USER_CONSTRAINTS WHERE table_name='nom_tabla'; #ota: Las limitaciones Eue tenamos a la @ora de borrar una columna con una restriccin 8($M/(9 709 tambiFn aplican aEu. 0s decir1 no # podremos borrar una restriccin de clave primaria si @ay otra tabla cuya clave ajena le @ace referencia. %/emplo )7: *amos a obtener la lista de restricciones de la tabla "raba%adores para ver cmo se llama la restriccin de tipo C60C7 impuesta sobre el atributo edad: SELECT * FROM USER_CONSTRAINTS WHERE table_name='TRABAJADORES';
*emos Eue se llama +9+HC::'#%; ya Eue nosotros no le pusimos nombre durante su definicin. 8ara borrar dic@a restriccin @aramos: ALTER TABLE Trabajadores DROP CONSTRAINT SYS_C004137; cB (0./M0 CO.+,(/$., 8odemos renombrar cualEuier restriccin de manera sencilla !racias a la si!uiente instruccin: ALTER TABLE Trabajadores RENAME CONSTRAINT nom_antiguo TO nom_nuevo; %/emplo )8: +i!uiendo con el %/emplo )7 vamos a renombrar la clave primaria a la Eue nosotros no le dimos nombre y el sistema la nombr como +9+HC::'#%3:
# (ealmente1 tanto D(O8 COL-M. como D(O8 CO.+,(/$., pueden llevar la clDusula C/+C/D0 la cual borrar las claves ajenas Eue apuntan a la restriccin pero no resulta muy recomendable su uso. 0s por ello Eue aEu no se @a mencionado. -D3 < Creacin1 modificacin y supresin de tablas y vistas
#3 = &%
ALTER TABLE Trabajadores RENAME CONSTRAINT SYS_C004138 TO pk_trabajadores; 6*3* ,ctiado y desactiado de restricciones 8or defecto1 las restricciones se activan al crearlas. +e pueden desactivar durante su creacin si aCadimos al final de la definicin de la restriccin la clDusula D$+/BL0 Ada i!ual Eue sea una restriccin de columna o de tablaB. .o obstante1 se pueden desactivar=activar restricciones una ve> creadas las tablas. aB D$+/BL0 CO.+,(/$., 8ara desactivar una restriccin ya creadas y Eue estF activa1 basta con ejecutar la si!uiente instruccin: ALTER TABLE nom_tabla DISABLE CONSTRAINT nom_restriccin; bB 0./BL0 CO.+,(/$., 8ara activar una restriccin ya creada y Eue estF desactivada @ay Eue ejecutar la si!uiente orden: ALTER TABLE nom_tabla ENABLE CONSTRAINT nom_restriccin; 7* :istas 6ay ocasiones en Eue deseamos Eue1 o bien por nuestra comodidad o por temas de privacidad1 slo se pueda ver cierta informacin de una tabla o cierta informacin recabada de un conjunto de tablas. Las vistas estDn justamente para este propsito. -na ista es una tabla l!ica & Eue permite acceder a la informacin de una o varias tablas. .o contiene informacin por s misma1 sino Eue su informacin estD basada en la Eue contienen otras tablas y siempre refleja los datos de estas tablas. 0s1 en definitiva1 una tabla Eue se construye a travFs de una consulta +?L. +i se suprime una tabla1 la vista asociada se invalida. Las vistas tienen la misma estructura Eue una tabla: filas y columnas1 y se tratan de forma semejante a una tabla. 0l formato para crear una vista es: CREATE [OR REPLACE] VIEW nom_vista [(nom_col1 [, nom_col2])] AS consulta [WITH {CHECK OPTION | READ ONLY} CONSTRAINT nom_restriccin]; /nalicemos los elementos de la orden C(0/,0 *$05: o [OR REPLACE]: +i la vista ya exista1 la reempla>a. o nom_vista: 0s el nombre Eue se le da a la vista. o [(nom_col1 [, nom_col2])]: +on los nombres de columnas Eue va a contener la vista. +i no se ponen1 se asumen los nombres de columna devueltos por la consulta. o AS consulta: Determina la informacin Eue va a visuali>arse cuando se consulte la vista. o [WITH CHECK OPTION]: +i se especifica1 +?L comprueba automDticamente cada operacin $.+0(, y -8D/,0 sobre la vista para ase!urarse Eue las
& -na tabla l!ica es una tabla Eue no estD almacenada en un soporte fsico. -D3 < Creacin1 modificacin y supresin de tablas y vistas
#4 = &%
filas resultantes satisfa!an el criterio de bGsEueda de la definicin de la vista. o [WITH READ ONLY]: 0specifica Eue slo se pueden @acer consultas sobre la vista Ainstrucciones +0L0C,B1 cualEuier modificacin o borrado darD error. o CONSTRAINT nom_restriccin: 0specifica el nombre de la restriccin 5$,6 C60C7 O8,$O. o 5$,6 (0/D O.L9. 8ara la creacin de vistas es imprescindible de disponer del privile!io C(0/,0 *$05. 0n caso de no disponer de dic@o privile!io1 basta con ejecutar la si!uiente instruccin desde el usuario +9+1 un usuario DB/ o cualEuier usuario Eue pueda otor!ar dic@o privile!io: GRANT CREATE VIEW TO Alumno; 7*)* Creacin y uso de istas sencillas Las vistas sencillas son las Eue acceden a una Gnica tabla. 8or ejemplo1 partiendo de la tabla del %/emplo ; Atabla "raba%adoresB vamos a crear una vista con las columnas codHtrab1 dni1 nombre y apellidos1 de aEuellos trabajadores pertenecientes al departamento de informDtica: CREATE VIEW Informaticos AS SELECT cod_trab, dni, nombre, apellidos FROM Trabajadores WHERE dpto='INF'; /@ora la vista creada se puede utili>ar como si de una tabla se tratase. +e puede consultar1 se pueden borrar filas1 actuali>ar filas Asiempre y cuando las columnas a actuali>ar no sean expresionesB y se pueden insertar datos siempre y cuando todas las columnas obli!atorias de la tabla asociada estFn presentes en la vista. ,ambiFn podramos @aber creado la vista dDndole nombre a las columnas1 por ejemplo: cod1 dni1 nom y ape. CREATE OR REPLACE VIEW Informaticos (cod, dni, nom, ape) AS SELECT cod_trab, dni, nombre, apellidos, dpto FROM Trabajadores WHERE dpto='INF'; 7*.* Consulta de istas creadas 8ara consultar las vistas creadas se dispone de las si!uientes vistas: o -+0(H*$05+: *istas creadas por el usuario. o /LLH*$05+: *istas accesibles por el usuario actual o DB/H*$05+: ,odas las vistas existentes en la base de datos. /s1 para visuali>ar los nombres de las vistas con sus textos @aramos: SELECT view_name, text FROM USER_VIEWS; 7*3* Creacin y uso de istas con >$'? C?%C4 &!'$&# y +%,D &#-5 +e puede crear una vista de forma Eue todas las operaciones $.+0(,1 -8D/,0 y D0L0,0 Eue se @a!an sobre ella satisfa!an la condicin por la Eue se cre la vista. 8or ejemplo1 vamos a crear una vista con todas las columnas de la tabla "raba%adores pero slo de aEuellos Eue pertenecen al departamento comercial: -D3 < Creacin1 modificacin y supresin de tablas y vistas
&: = &%
CREATE VIEW Comerciales AS SELECT * FROM Trabajadores WHERE dpto='COM'; +i a@ora insertamos en la vista un empleado Eue pertene>ca a otro departamento Oracle no dara nin!Gn error: INSERT INTO Comerciales VALUES (443, '444W', 'Paco', 'Blasco', 'INF'); /@ora bien1 si lo Eue Eueremos es Eue cualEuier insercin o modificacin slo pueda reali>arse sobre trabajadores del departamento comercial1 entonces deberamos crear la vista con la opcin 5$,6 C60C7 O8,$O.. CREATE OR REPLACE VIEW Comerciales AS SELECT * FROM Trabajadores WHERE dpto='COM' WITH CHECK OPTION; +i a@ora tratamos de reali>ar la misma operacin de insercin anterior obtendramos el si!uiente error: Informe de error: Error SQL: ORA-01402: violacin de la clusula WHERE en la vista WITH CHECK OPTION 0n cambio1 si lo Eue pretendemos es Eue la vista sea de slo lectura para Eue no puedan reali>arse cambios sobre ella1 entonces deberamos crear la vista con la opcin 5$,6 (0/D O.L9. CREATE OR REPLACE VIEW Comerciales AS SELECT * FROM Trabajadores WHERE dpto='COM' WITH READ ONLY; La Gnica operacin Eue funcionarD serD +0L0C,1 el resto de operaciones $.+0(,1 -8D/,0 y D0L0,0 fallarDn. 7*6* Creacin y uso de istas comple/as Las vistas complejas contienen consultas Eue se definen sobre mDs de una tabla1 a!rupan filas usando las clDusulas G(O-8 B9 o D$+,$.,C1 usan funciones1 etc. 0ste tipo de vistas slo se podrDn consultar. %/emplo )9: $ma!inemos Eue se @an definido las si!uientes tablas: CREATE TABLE Departamentos ( cod_dpto CHAR(5) PRIMARY KEY, nom_dpto VARCHAR2(20) NOT NULL ); CREATE TABLE Empleados ( cod_emp NUMBER PRIMARY KEY, nombre VARCHAR2(20) NOT NULL, apellidos VARCHAR2(40) NOT NULL, dni CHAR(10) UNIQUE, edad NUMBER CHECK(edad >= 16), dpto CHAR(5) REFERENCES Departamentos ); /@ora creamos una vista Eue conten!a slo el nombre y apellidos del empleado junto con el nombre del departamento al Eue pertenece: CREATE VIEW Currantes AS SELECT E.nombre, E.apellidos, D.nom_dpto FROM Departamentos D, Empleados E WHERE E.dpto= D.cod_dpto; -D3 < Creacin1 modificacin y supresin de tablas y vistas
&# = &%
+i a@ora tratamos de reali>ar una insercin o modificacin sobre la vista nos encontraremos con el si!uiente error: INSERT INTO Currantes VALUES ('Luca', 'Esteban', 'Informtica'); Informe de error: Error SQL: ORA-01776: no se puede modificar ms de una tabla base a travs de una vista de unin 7*7* Borrado de istas 0s posible borrar las vistas con la orden D(O8 *$051 cuyo formato es: DROP VIEW nom_vista; 8* (innimos Cuando tenemos acceso a las tablas de otro usuario y deseamos consultarlas es preciso teclear el nombre del usuario propietario antes del nombre de la tabla. 0s decir1 si nosotros tenemos acceso a la tabla Departamento del usuario Pedro y Eueremos consultar sus datos1 entonces tendremos Eue teclear la si!uiente orden: SELECT * FROM Pedro.Departamento; +in embar!o1 mediante el uso de sinnimos1 podemos crear un alias para referirnos a dic@a tabla sin necesidad de incluir su nombre: SELECT * FROM Tabla_Pedro; 0n definitiva1 un sinnimo es un nuevo nombre Eue se puede dar a una tabla1 vista1 secuencia1 procedimiento1 funcin1 paEuete1 un tipo definido por nosotros u otro sinnimo. Con los sinnimos se pueden utili>ar dos nombres diferentes para referirse a un mismo objeto. /unEue los podemos utili>ar sobre nuestros propios objetos1 resultan muy prDcticos a la @ora de referirnos a objetos de otros usuarios para evitar escribir el nombre de usuario delante de la tabla. 8*)* Creacin de sinnimos 0l formato para crear sinnimos es el si!uiente: CREATE [OR REPLACE] [PUBLIC] SYNONYM sinnimo FOR [usuario.]nom_objeto; +i justo despuFs de C(0/,0 aCadimos O( (08L/C01 pasa lo si!uiente: si no @aba nin!Gn sinnimo creado con dic@o nombre entonces se crea1 si ya exista1 entonces se sustituye el anterior sinnimo por este. +i especificamos Eue un sinnimo es 8-BL$C1 entonces dic@o sinnimo podrD ser accedido por cualEuier usuario. .o obstante1 cada usuario Eue Euiera utili>ar el sinnimo deberD tener los privile!ios necesarios para acceder al objeto referido por el sinnimo. 0s decir1 si un usuario no tiene permisos para acceder a una tabla1 aunEue @aya un sinnimo pGblico para acceder a ella1 el usuario se!uirD sin poder acceder a dic@o objeto. 6ay una serie de consideraciones importantes Eue @ay Eue tener en cuenta cuando se desea trabajar con sinnimos: o 8ara crear sinnimos privados sobre nuestro propio esEuema1 es necesario disponer del privile!io C(0/,0 +9.O.9M1 el cual no se otor!a por defecto. o 8ara crear sinnimos dentro del esEuema de otro usuario1 es necesario tener el privile!io C(0/,0 /.9 +9.O.9M. -D3 < Creacin1 modificacin y supresin de tablas y vistas
&& = &%
o 8ara crear sinnimos pGblicos es necesario disponer del privile!io C(0/,0 8-BL$C +9.O.9M. %/emplo )8: +i nosotros tenemos una tabla llamada Departamentos pero Eueremos referirnos a ella a travFs del texto Depart1 podemos crear un alias: CREATE SYNONYM Depart FOR Departamento; De esta manera podemos consultar el contenido de la tabla de los departamentos mediante su nombre o su sinnimo: SELECT * FROM Departamento; SELECT * FROM Depart; #ota: +i nuestro usuario no dispone de los privile!ios para crear sinnimos1 entonces deberamos acceder al sistema mediante el usuario +9+ o +9+,0M y ejecutar la si!uiente orden: GRANT CREATE SYNONYM TO usuario; 8*.* Borrado de sinnimos De manera similar a como se borran las tablas se borran los sinnimos. +u sintaxis es: DROP [PUBLIC] SYNONYM [usuario.]sinnimo; /l i!ual Eue durante la creacin1 @ay Eue tener en cuenta lo si!uiente a la @ora de borrar sinnimos: o .o es necesario disponer de nin!Gn privile!io especial para borrar nuestros propios sinnimos. o Tnicamente los usuarios de tipo DB/ y aEuellos con el privile!io D(O8 8-BL$C +9.O.9M pueden borrar sinnimos pGblicos. o +lo los usuarios DB/ y aEuellos con el privile!io D(O8 /.9 +9.O.9M pueden borrar los sinnimos de otros usuarios %/emplo );: 8ara borrar el sinnimo Depart creado anteriormente @aramos: DROP SYNONYM Depart; 8*3* Consulta de sinnimos 8odemos consultar los sinnimos Eue @emos creado a travFs de la vista -+0(H+9.O.9M+. Basta con ejecutar la si!uiente instruccin: SELECT * FROM USER_SYNONYMS; 9* Cambios de nombre 0xiste una orden en +?L para renombrar tablas1 vistas1 secuencias o sinnimos priados Ano se pueden renombrar sinnimos de otros usuarios o sinnimos pGblicosB. +u sintaxis es la si!uiente: RENAME antiguo_nombre TO nuevo_nombre; 6ay Eue tener presente Eue las restricciones de inte!ridad1 los ndices y los permisos dados al objeto se transfieren automDticamente al nuevo objeto. +in -D3 < Creacin1 modificacin y supresin de tablas y vistas
&% = &%
embar!o1 Oracle invalida todos los objetos Eue dependen del objeto renombrado1 como las vistas1 los sinnimos1 los procedimientos y las funciones Eue @acen referencia al objeto renombrado. 8* Biblio3rafa &istemas 'estores de (ases de Datos. &:#:. 0ditorial: McGraUS6ill. Documentacin de Oracle: @ttp:==UUU.oracle.com=pls=xe#:&=@omepa!e Ainformacin slo de la versin Q0B @ttp:==UUU.oracle.com=pls=db#:&=@omepa!e Ainformacin de la versin !eneralB