You are on page 1of 23

Bases de Datos

Bloque 3: Diseo Fsico de Bases de Datos




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_columna,
Definicin_restriccin,

Definicin_restriccin
) [TABLESPACE nom_espacio];

Definicin_columna:= nom_col tipo [CONSTRAINT nom_restriccin]
[NOT NULL] [UNIQUE] [PRIMARY KEY] [DEFAULT valor]
[REFERENCES nom_tabla [(nom_col1[,nom_col2])] [ON DELETE CASCADE]]
[CHECK (condicin)]

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