Beruflich Dokumente
Kultur Dokumente
- Acceso a la informacin
ndice de contenido
Vistas (create view)..............................................................................................................................2
Vistas (informacin).............................................................................................................................8
Vistas eliminar (drop view)..................................................................................................................9
Vistas (modificar datos a travs de ella).............................................................................................11
Vistas (with read only)........................................................................................................................16
Vistas modificar (create or replace view)...........................................................................................19
Vistas (with check option)..................................................................................................................22
Vistas (otras consideraciones)............................................................................................................25
Vistas materializadas (materialized view)..........................................................................................28
Seguridad y acceso a Oracle...............................................................................................................31
Usuarios (crear)..................................................................................................................................32
Permiso de conexin...........................................................................................................................35
Privilegios del sistema (conceder)......................................................................................................40
Privilegios del sistema (with admin option).......................................................................................45
Privilegios sobre los objetos...............................................................................................................46
Retirada de privilegios...................................................................................................................47
Conceder privilegios a los roles.....................................................................................................48
Lmites en privilegios sobre roles..................................................................................................48
Perfiles................................................................................................................................................50
Los nombres para vistas deben seguir las mismas reglas que cualquier identificador. Para distinguir
una tabla de una vista podemos fijar una convencin para darle nombres, por ejemplo, colocar el
sufijo vista y luego el nombre de las tablas consultadas en ellas.
Los campos y expresiones de la consulta que define una vista DEBEN tener un nombre. Se debe
colocar nombre de campo cuando es un campo calculado o si hay 2 campos con el mismo nombre.
Note que en el ejemplo, al concatenar los campos "apellido" y "nombre" colocamos un alias; si no
lo hubisemos hecho aparecera un mensaje de error porque dicha expresin DEBE tener un
encabezado, Oracle no lo coloca por defecto.
Los nombres de los campos y expresiones de la consulta que define una vista DEBEN ser nicos
(no puede haber dos campos o encabezados con igual nombre). Note que en la vista definida en el
ejemplo, al campo "s.nombre" le colocamos un alias porque ya haba un encabezado (el alias de la
concatenacin) llamado "nombre" y no pueden repetirse, si sucediera, aparecera un mensaje de
error.
Otra sintaxis es la siguiente:
create view NOMBREVISTA (NOMBRESDEENCABEZADOS)
as
SUBCONSULTA;
La diferencia es que se colocan entre parntesis los encabezados de las columnas que aparecern en
la vista. Si no los colocamos y empleamos la sintaxis vista anteriormente, se emplean los nombres
de los campos o alias (que en este caso habra que agregar) colocados en el "select" que define la
vista. Los nombres que se colocan entre parntesis deben ser tantos como los campos o expresiones
que se definen en la vista.
Las vistas se crean en la base de datos activa.
Al crear una vista, Oracle verifica que existan las tablas a las que se hacen referencia en ella; no se
puede crear una vista que referencie tablas inexistentes. No se puede crear una vista si existe un
objeto con ese nombre.
Se aconseja probar la sentencia "select" con la cual definiremos la vista antes de crearla para
asegurarnos que el resultado que retorna es el imaginado.
Una vista siempre est actualizada; si modificamos las tablas base (a las cuales referencia la vista),
la vista mostrar los cambios.
Se pueden construir vistas sobre otras vistas.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Eliminamos las tablas:
drop table empleados;
drop table secciones;
codigo number(2),
nombre varchar2(20),
sueldo number(5,2)
constraint CK_secciones_sueldo check (sueldo>=0),
constraint PK_secciones primary key (codigo)
);
create table empleados(
legajo number(5),
documento char(8),
sexo char(1)
constraint CK_empleados_sexo check (sexo in ('f','m')),
apellido varchar2(20),
nombre varchar2(20),
domicilio varchar2(30),
seccion number(2) not null,
cantidadhijos number(2)
constraint CK_empleados_hijos check (cantidadhijos>=0),
estadocivil char(10)
constraint CK_empleados_estadocivil check (estadocivil in
('casado','divorciado','soltero','viudo')),
fechaingreso date,
constraint PK_empleados primary key (legajo),
constraint FK_empleados_seccion
foreign key (seccion)
references secciones(codigo),
constraint UQ_empleados_documento
unique(documento)
);
Vemos la informacin:
select *from vista_empleados_ingreso;
Hemos aprendido que los registros resultantes de una vista no se almacena en la base de datos, sino
la definicin de la vista, por lo tanto, al modificar las tablas referenciadas por la vista, el resultado
de la vista cambia.
Modificamos una fecha en la tabla "empleados" y luego consultamos la vista para verificar que est
actualizada:
update empleados set fechaingreso='10/09/2000' where fechaingreso='10/09/1998';
select *from vista_empleados_ingreso;
Primer problema:
Un club dicta cursos de distintos deportes. Almacena la informacin en varias tablas. El director no
quiere que los empleados de administracin conozcan la estructura de las tablas ni algunos datos de
los profesores y socios, por ello se crean vistas a las cuales tendrn acceso.
1- Elimine las tablas y crelas nuevamente:
drop
drop
drop
drop
table
table
table
table
inscritos;
cursos;
socios;
profesores;
into
into
into
into
socios
socios
socios
socios
insert
insert
insert
insert
into
into
into
into
profesores
profesores
profesores
profesores
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
cursos
cursos
cursos
cursos
cursos
cursos
cursos
cursos
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
inscritos
inscritos
inscritos
inscritos
inscritos
inscritos
values(1,'tenis','lunes','22222222');
values(2,'tenis','martes','22222222');
values(3,'natacion','miercoles','22222222');
values(4,'natacion','jueves','23333333');
values(5,'natacion','viernes','23333333');
values(6,'futbol','sabado','24444444');
values(7,'futbol','lunes','24444444');
values(8,'basquet','martes','24444444');
values('30000000',1,'s');
values('30000000',3,'n');
values('30000000',6,null);
values('31111111',1,'s');
values('31111111',4,'s');
values('32222222',8,'s');
4- Cree una vista en la que aparezca el nombre del socio, el deporte, el da, el nombre del profesor y
el estado de la matrcula (deben incluirse los socios que no estn inscritos en ningn deporte, los
cursos para los cuales no hay inscritos y los profesores que no tienen designado deporte tambin)
Vistas (informacin)
Las vistas son objetos, as que para obtener informacin de ellos pueden consultarse los siguientes
catlogos.
"user_catalog" nos muestra todos los objetos del usuario actual, incluidas las vistas. En la columna
"table_type" aparece "view" si es una vista. Ejemplo:
select *from user_catalog where table_type='VIEW';
"user_objects" nos muestra informacin sobre todos los objetos del usuario actual. En la columna
"OBJECT_TYPE" muestra "view" si es una vista, aparece la fecha de creacin y dems
informacin que no analizaremos por el momento.
Para ver todos los objetos del usuario actual que son vistas tipeamos:
select *from user_catalog where object_type='VIEW';
"user_views" nos muestra informacin referente a todas las vistas del usuario actual, el nombre de
la vista, la longitud del texto, el texto que la define, etc.
Con la siguiente sentencia obtenemos informacin sobre todas las vistas cuyo nombre comience con
la cadena "VISTA":
select *from user_views where view_name like 'VISTA%';
Si se elimina una tabla a la que hace referencia una vista, la vista no se elimina, hay que eliminarla
explcitamente.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Eliminamos las tablas:
drop table empleados;
drop table secciones;
Si consultamos la vista, aparecer un mensaje de error, pues la tabla "empleados" a la cual hace
referencia la vista, no existe:
select *from vista_empleados;
Eliminamos la vista:
drop view vista_empleados;
Creamos otra vista de "empleados" denominada "vista_empleados2" que consulta solamente la tabla
"empleados":
create view vista_empleados2
as
select legajo,nombre,apellido,fechaingreso,seccion,sueldo
from empleados
where sueldo>=600;
Consultamos la vista:
select *from vista_empleados2;
No podemos ingresar un registro en la vista "vista_empleados" porque tal vista tiene campos
calculados ("nombre", que es una concatenacin de "apellido" y "nombre"), adems afecta a 2
tablas ("empleados" y "secciones") y hay campos no accesibles desde la vista que no admiten
valores nulos. Si ejecutamos el siguiente "insert", Oracle mostrar un mensaje de error:
insert into vista_empleados values('Pedro Perez','m','Sistemas',2);
Podemos ingresar un registro en la vista "vista_empleados2" porque tal vista afecta a una sola tabla
y los campos de ""empleados" no accesibles desde la vista admiten valores nulos:
insert into vista_empleados2 values(200,'Pedro','Perez','10/10/2000',2,800);
Vemos la tabla "empleados" para comprobar que el nuevo registro insertado desde la vista est
presente en "empleados", los campos para los cuales no se ingresaron datos, almacenan el valor
"null":
select *from empleados;
Si podemos actualizar otros campos, por ejemplo, el campo "cantidadhijos" de un empleado a travs
de la vista "vista_empleados":
update vista_empleados set cantidadhijos=3 where nombre='Lopez Beatriz';
Primer problema:
Un club dicta cursos de distintos deportes. Almacena la informacin en varias tablas.
1- Elimine las tabla "inscritos", "socios" y "cursos":
drop table inscritos;
drop table socios;
drop table cursos;
into
into
into
into
socios
socios
socios
socios
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
cursos
cursos
cursos
cursos
cursos
cursos
cursos
values(1,'tenis','lunes','Ana Acosta');
values(2,'tenis','martes','Ana Acosta');
values(3,'natacion','miercoles','Ana Acosta');
values(4,'natacion','jueves','Carlos Caseres');
values(5,'futbol','sabado','Pedro Perez');
values(6,'futbol','lunes','Pedro Perez');
values(7,'basquet','viernes','Pedro Perez');
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
inscritos
inscritos
inscritos
inscritos
inscritos
inscritos
inscritos
values('30000000',1,'s');
values('30000000',3,'n');
values('30000000',6,null);
values('31111111',1,'s');
values('31111111',4,'s');
values('32222222',1,'s');
values('32222222',7,'s');
4- Realice un join para mostrar todos los datos de todas las tablas, sin repetirlos (7 registros)
5- Elimine la vista "vista_cursos"
6- Cree la vista "vista_cursos" que muestre el nmero, deporte y da de todos los cursos.
7- Consulte la vista ordenada por deporte (7 registros)
8- Ingrese un registro mediante la vista "vista_cursos" y vea si afect a "cursos"
9- Actualice un registro sobre la vista y vea si afect a la tabla "cursos"
10- Elimine un registro de la vista para el cual no haya inscritos y vea si afect a "cursos"
11- Intente eliminar un registro de la vista para el cual haya inscritos
12- Elimine la vista "vista_inscritos" y crela para que muestre el documento y nombre del socio, el
Evitamos que Oracle acepte "insert", "update" o "delete" sobre la vista si colocamos "with read
only" luego de la subconsulta que define una vista.
Por ejemplo, creamos la siguiente vista:
create view vista_empleados
as
select apellido, nombre, sexo, seccion
from empleados
with read only;
Oracle responde con un mensaje de error ante cualquier "insert", "update" o "delete" realizado sobre
la vista.
Problema:
Una empresa almacena la informacin de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
drop table empleados;
321','Contaduria',2,'casado','10/09/1998');
insert into empleados values('26666666','f','Perez','Laura','Peru
1254','Sistemas',3,'casado','05/09/2000');
Creamos la vista "vista_empleados2", igual que "vista_empleados", pero ahora colocamos "with
read only" para impedir que puedan ejecutarse "insert", "update" y "delete" sobre esta vista:
create view vista_empleados2
as
select apellido, nombre, sexo, seccion
from empleados
with read only;
No lo permite.
Ingresamos un registro en la tabla "empleados" a travs de la vista "vista_empleados":
insert into vista_empleados values('Juarez','Juan','m','Sistemas');
Oracle no lo permite porque la vista fue definida con "with read only".
Eliminamos un registro en la tabla "empleados" a travs de la vista "vista_empleados":
delete from vista_empleados where apellido='Juarez';
Oracle no lo permite porque la vista fue definida con "with read only".
Primer problema:
Una empresa almacena la informacin de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla:
drop table clientes;
2- Cree la tabla:
create table clientes(
nombre varchar2(40),
documento char(8),
domicilio varchar2(30),
ciudad varchar2(30)
);
4- Cree o reemplace la vista "vista_clientes" para que recupere el nombre y ciudad de todos los
clientes
5- Cree o reemplace la vista "vista_clientes2" para que recupere el nombre y ciudad de todos los
clientes no permita modificaciones.
6- Consulte ambas vistas
7- Intente ingresar el siguiente registro mediante la vista que permite slo lectura
Oracle no lo permite.
8- Ingrese el registro anterior en la vista "vista_clientes"
9- Intente modificar un registro mediante la vista que permite slo lectura
10- Actualice el registro anterior en la vista "vista_clientes"
11- Intente eliminar un registro mediante la vista "vista_clientes2"
12- Elimine todos los clientes de "Buenos Aires" a travs de la vista "vista_clientes"
Con "create or replace view" se modifica la definicin de una vista existente o se crea si no existe.
Problema:
Una empresa almacena la informacin de sus empleados en dos tablas llamadas "empleados" y
"secciones".
Eliminamos las tablas:
drop table empleados;
drop table secciones;
into
into
into
into
into
empleados
empleados
empleados
empleados
empleados
Creamos la vista "vista_empleados" que muestre algunos campos de los empleados de la seccin 1:
create view vista_empleados
as
select documento,nombre,seccion
from empleados
where seccion=1;
Consultamos la vista:
select *from vista_empleados;
Primer problema:
Un club dicta cursos de distintos deportes. Almacena la informacin en varias tablas.
1- Elimine las tablas "inscritos", "socios" y "cursos":
drop table inscritos;
drop table socios;
drop table cursos;
constraint PK_inscritos_documento_numero
primary key (documentosocio,numero),
constraint FK_inscritos_documento
foreign key (documentosocio)
references socios(documento),
constraint FK_inscritos_numero
foreign key (numero)
references cursos(numero)
);
into
into
into
into
socios
socios
socios
socios
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
cursos
cursos
cursos
cursos
cursos
cursos
cursos
values(1,'tenis','lunes','Ana Acosta');
values(2,'tenis','martes','Ana Acosta');
values(3,'natacion','miercoles','Ana Acosta');
values(4,'natacion','jueves','Carlos Caseres');
values(5,'futbol','sabado','Pedro Perez');
values(6,'futbol','lunes','Pedro Perez');
values(7,'basquet','viernes','Pedro Perez');
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
inscritos
inscritos
inscritos
inscritos
inscritos
inscritos
inscritos
values('30000000',1,'s');
values('30000000',3,'s');
values('30000000',6,null);
values('31111111',1,'n');
values('31111111',4,'s');
values('32222222',1,'n');
values('32222222',7,'n');
4- Cree o reemplace la vista "vista_inscritos" que muestre el documento y nombre del socio, el
deporte, el da y la matrcula, de todas las inscripciones no pagas
5- Consulte la vista
6- Veamos el texto de la vista
7- Modifique la vista para que muestre el domicilio
8- Consulte la vista para ver si se modific
9- Vea el texto de la vista
Problema:
Una empresa almacena la informacin de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
drop table empleados;
Creamos la tabla:
create table empleados(
documento char(8),
sexo char(1)
constraint CK_empleados_sexo check (sexo in ('f','m')),
apellido varchar2(20),
nombre varchar2(20),
seccion varchar2(30),
cantidadhijos number(2),
constraint CK_empleados_hijos check (cantidadhijos>=0),
estadocivil char(10)
constraint CK_empleados_estadocivil check (estadocivil in
('casado','divorciado','soltero','viudo'))
);
Creamos o reemplazamos (si existe) la vista "vista_empleados", para que muestre el nombre,
apellido, sexo y seccin de todos los empleados de "Administracion" agregando la clusula "with
check option" para evitar que se modifique la seccin de tales empleados a travs de la vista y que
se ingresen empleados de otra seccin:
create or replace view vista_empleados
as
select apellido, nombre, sexo, seccion
from empleados
where seccion='Administracion'
with check option;
Consultamos la vista:
select *from vista_empleados;
Oracle acepta la insercin porque ingresamos un valor para "seccion" que incluir el registro en la
vista.
Intentamos ingresar un empleado de otra seccin:
insert into vista_empleados values('Torres','Tatiana','f','Sistemas');
Oracle no acepta la insercin porque ingresamos un valor para "seccion" que excluir el nuevo
registro de la vista.
Primer problema:
Una empresa almacena la informacin de sus clientes en una tabla llamada "clientes".
1- Elimine la tabla:
drop table clientes;
2- Cree la tabla:
create table clientes(
nombre varchar2(40),
documento char(8),
domicilio varchar2(30),
ciudad varchar2(30)
);
4- Cree o reemplace la vista "vista_clientes" para que recupere el nombre y ciudad de todos los
clientes que no sean de "Cordoba" sin emplear "with check option"
5- Cree o reemplace la vista "vista_clientes2" para que recupere el nombre y ciudad de todos los
clientes que no sean de "Cordoba" empleando "with check option"
6- Consulte ambas vistas
7- Intente modificar la ciudad del cliente "Pedro Perez" a "Cordoba" travs de la vista que est
restringida.
8- Realice la misma modificacin que intent en el punto anterior a travs de la vista que no est
restringida
9- Actualice la ciudad del cliente "Oscar Luque" a "Buenos Aires" mediante la vista restringida
10- Verifique que "Oscar Luque" an se incluye en la vista
11- Intente ingresar un empleado de "Cordoba" en la vista restringida
12- Ingrese el empleado anterior a travs de la vista no restringida
13- Ingrese un empleado de "Salta" en la vista restringida
14- Verifique que el nuevo registro est incluido en la vista
De esta manera, podemos crear una vista y despus las tablas involucradas; luego, al consultar la
vista, DEBEN existir las tablas.
Al crear la vista la opcin predeterminada es "no force". Se recomienda crear las tablas y luego las
vistas necesarias.
Otra cuestin a considerar es la siguiente: si crea una vista con "select *" y luego agrega campos a
la estructura de las tablas involucradas, los nuevos campos no aparecern en la vista; esto es porque
los campos se seleccionan al ejecutar "create view"; debe volver a crear la vista (con "create view"
o "create or replace view").
Problema:
Una empresa almacena la informacin de sus empleados en una tabla llamada "empleados".
Eliminamos la tabla:
drop table empleados;
Creamos la vista "vista_empleados" que muestre algunos campos de "empleados", pero la tabla
"empleados" no existe, por ello, debemos agregar, al crear la vista "force":
create force view vista_empleados
as
select documento,nombre,seccion
from empleados;
Creamos la tabla:
create table empleados(
documento char(8),
nombre varchar2(30),
domicilio varchar2(30),
seccion varchar2(30)
);
321','Contaduria');
insert into empleados values('26666666','Perez Laura','Peru
1254','Secretaria');
Consultamos la vista:
select *from vista_empleados;
Creamos o reemplazamos (si existe) la vista "vista_empleados" que muestre todos los campos de la
tabla "empleados":
create or replace view vista_empleados
as
select *from empleados;
Consultamos la vista:
select *from vista_empleados;
Note que el nuevo campo agregado a "empleados" no aparece, a pesar que la vista indica que
muestre todos los campos de dicha tabla; esto sucede porque los campos se seleccionan al ejecutar
"create view", para que aparezcan debemos volver a crear la vista:
create or replace view vista_empleados
as
select *from empleados;
Consultemos la vista:
select *from vista_empleados;
3- Intente crear o reemplazar la vista "vista_clientes" para que muestre el nombre, domicilio y
ciudad
de
todos
los
clientes
de
"Cordoba"
(sin
emplear
"force")
Mensaje de error porque la tabla referenciada no existe.
4- Cree o reemplace la vista "vista_clientes" para que recupere el nombre, apellido y ciudad de
todos los clientes de "Cordoba" empleando "force"
5- Cree la tabla:
create table clientes(
nombre varchar2(40),
documento char(8),
domicilio varchar2(30),
ciudad varchar2(30)
);
7- Cree o reemplace la vista "vista_clientes" para que muestre todos los campos de la tabla
"clientes"
8- Consulte la vista
9- Agregue un campo a la tabla "clientes"
10- Consulte la vista "vista_clientes"El nuevo campo agregado a "clientes" no aparece, pese a que
la vista indica que muestre todos los campos de dicha tabla.
11- Modifique la vista para que aparezcan todos los campos
12- Consulte la vista:Ahora si aparece el campo.
Existen varias clusulas que podemos agregar al crear una vista materializada, pero no las
estudiaremos.
En el "from" de la consulta pueden listarse tablas, vistas y vistas materializadas.
Entonces, una vista materializada almacena su resultado fsicamente. Una vista materializada
(materialized view) es una instantnea (snapshot), son sinnimos.
Para obtener informacin acerca de las vistas materializadas podemos consultar el diccionario
"user_objects", en la columna "object_type" aparecer "materialized view" si es una vista
materializada. Ejemplo:
select *from user_objects where object_type='MATERIALIZED VIEW';
Tambin podemos consultar "user_mviews" para obtener informacin de todas las vistas
materializadas del usuario actual:
select *from user_mviews;
Ejemplo:
drop materialized view vm_promedios;
into
into
into
into
alumnos
alumnos
alumnos
alumnos
insert
insert
insert
insert
insert
insert
insert
insert
insert
insert
into
into
into
into
into
into
into
into
into
into
notas
notas
notas
notas
notas
notas
notas
notas
notas
notas
values('23333333','Acosta','Ana','Avellaneda 111');
values('24444444','Bustos','Betina','Bulnes 222');
values('25555555','Caseros','Carlos','Colon 333');
values('26666666','Duarte','Daniel','Dinamarca 444');
values('23333333','10/05/2007',5.3);
values('23333333','15/07/2007',8.3);
values('23333333','20/09/2007',7.4);
values('24444444','10/05/2007',8.6);
values('24444444','15/07/2007',9.4);
values('25555555','10/05/2007',9);
values('25555555','15/07/2007',6);
values('26666666','10/05/2007',3.2);
values('26666666','15/07/2007',5.3);
values('26666666','20/09/2007',3.5);
Creamos o reemplazamos una vista normal que muestre el documento del alumnos y el promedio de
sus notas:
create or replace view vista_promedios
as select a.documento,avg(nota) as promedio
from alumnos a
join notas n
on a.documento=n.documento
group by a.documento;
Creamos una vista materializada que muestre el documento del alumnos y el promedio de sus notas:
create materialized view vm_promedios
as
select a.documento,avg(nota) as promedio
from alumnos a
join notas n
on a.documento=n.documento
group by a.documento;
El resultado es el mismo.
Ahora agregamos algunas notas:
insert into notas values('23333333','12/10/2007',9);
insert into notas values('24444444','12/10/2007',7.5);
Los promedios de la vista actualizable han cambiado porque al ejecutar el primer "select" se
consultaron las tablas "notas" y "alumnos"; los promedios de la vista materializada no han
cambiado, porque almacenaron el resultado de la consulta, al ejecutar el segundo "select" no se
consultaron las tablas "alumnos" y "notas".
Usuarios (crear)
Puede haber varios usuarios diferentes de la base de datos. Cada uno es propietario de sus objetos.
Para crear un usuario debemos conectarnos a la base datos como administradores (por ejemplo
"system").
Sintaxis bsica para crear un usuario:
create user NOMBREUSUARIO identified by CONTRASEA
default tablespace NOMBRETABLESPACEPORDEFECTO
quota CANTIDAD on TABLEESPACE;
** [default role ROLE, ALL];
Con la sentencia anterior se crea un usuario denominado "ana" con la clave "anita", el tablespace
por defecto es "system" porque no se especific otro.
Con la siguiente sentencia se crea un usuario denominado "juan" con la clave "juancito", se le
asigna un espacio de 100 mb:
create user juan identified by juancito
default tablespace system
quota 100M on system;
Si intentamos crear un usuario que ya existe, Oracle muestra un mensaje de error indicando tal
situacin.
El diccionario "dba_users" muestra informacin sobre todos los usuarios; el nombre de usuario
(username), contrasea (password), estado (account_status), espacio (default_tablespace), fecha de
expiracin (expiry_date), fecha de creacin (created), entre otros.
Luego de crear un usuario, an no podemos conectarnos, ya que no tenemos permiso para crear una
sesin. Los permisos se aprendern prximamente.
Problema:
Sabemos que para crear un usuario debemos conectarnos a la base datos como administradores (por
ejemplo "system").
Necesitamos crear un usuario "ana"; antes vamos a eliminarlo por si existe (luego veremos
detenidamente cmo eliminar usuarios y explicaremos la siguiente sentencia):
drop user ana cascade;
Si intentamos crear un usuario que ya existe, Oracle muestra un mensaje de error indicando tal
situacin.
create user juan identified by juancito;
Mensaje de error.
Consultamos el diccionario "dba_users" y analizamos la informacin que nos muestra:
select username, password, default_tablespace, created from dba_users;
Si intentamos crear un usuario que ya existe, Oracle muestra un mensaje de error indicando tal
situacin.
create user juan identified by juancito;
Mensaje de error.
Permiso de conexin
Los usuarios necesitan permisos para poder acceder a la base de datos y a los objetos de la misma.
Los privilegios pueden ser de dos tipos: del sistema y sobre objetos.
Como mnimo, un usuario debe tener permiso para conectarse.
El permiso "create session" es un privilegio de sistema.
Para conceder permiso de conexin a un usuario empleamos la instruccin "grant".
Sintaxis bsica:
grant create session
to USUARIO;
Podemos consultar el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a los
usuarios. Nos mostrar el nombre del usuario (grantee) y el permiso (privilege), entre otra
informacin que analizaremos prximamente.
Luego de tener permiso para crear sesin, puede crear una sesin presionando el cono "new
connection" en la solapa "connections"; se abrir una ventana en la cual deber colocar un nombre
de conexin ("connection name", puede ser el mismo nombre de usuario), el nombre del usuario
("username") y la contrasea ("password"), luego presionar el botn "connect"; se abrir una nueva
solapa (nueva conexin) con el nombre del usuario; no se abrir la nueva conexin si:
a) el usuario para quien quiere abrir una nueva sesin no existe,
b) la contrasea es incorrecta o
c) el usuario existe pero no tiene permiso "create session".
Si consultamos el diccionario "user_sys_privs" obtendremos la misma informacin que
"dba_sys_privs" pero nicamente del usuario actual.
Podemos averiguar el nombre del usuario conectado con la siguiente sentencia:
select user from dual;
Problema:
Creamos un usuario denominado "ana", con contrasea "anita", le asignamos espacio en "system"
(100M). Antes lo eliminamos por si existe:
drop user ana cascade;
create user ana identified by anita
default tablespace system
quota 100M on system;
Aparece Juan.
Volvemos a la conexin "system" (la otra solapa).
Comprobamos el usuario actual:
select user from dual;
Aparece System.
Ya sabemos abrir una nueva sessin de usuario. Aprendimos que existen 3 razones por las cuales
una nueva sesin no se pueda iniciar; una de ellas es que el usuario no exista. Intentemos abrir una
nueva conexin para un usuario inexistente:
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la cual
colocamos:
- "connection name" (nombre de la conexin): pedro;
- "username" (nombre del usuario): pedro y
- "password" (contrasea): pedrito.
Luego presionamos "connect"; la sessin no se abre, un mensaje de error indica que el nombre de
usuario o la contrasea son invlidas y que la conexin se deniega.
Cancelamos.
Otra razn por la cual la apertura de una nueva sesin puede fallar es que el usuario no tenga
permiso de conexin. Intentemos abrir una nueva conexin para un usuario que no tenga tal
permiso, caso de "ana":
Presionamos el cono "new connection" en la solapa "connections"; se abre una ventana en la cual
colocamos:
- "connection name" (nombre de la conexin): ana;
- "username" (nombre del usuario): ana y
- "password" (contrasea): anita.
Luego presionamos "connect"; la sessin no se abre, un mensaje de error indica que el usuario "ana"
no tiene permiso "create session" por lo cual se deniega la conexin. Cancelamos.
Concedemos a "ana" permiso de conexin:
grant create session
to ana;
Primer problema:
Una escuela necesita crear 3 usuarios diferentes en su base de datos. Uno denominado "director",
otro "profesor" y un tercero "alumno".
Conctese como administrador (por ejemplo "system").
1- Elimine el usuario "director", porque si existe, aparecer un mensaje de error:
drop user director cascade;
18- Intentemos abrir una nueva conexin para el usuario "alumno", el cual no tiene permiso. Un
mensaje de error indica que el usuario "alumno" no tiene permiso "create session" por lo cual se
deniega la conexin. Cancele.
19- Conceda a "alumno" permiso de conexin
20- Consulte el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a "alumno"
21- Abra una nueva conexin para "ALUMNO". Se debe abrir una nueva solapa (nueva conexin)
con el nombre del usuario (profesor)
22- Consulte el diccionario "user_sys_privs"
23- Compruebe que est en la sesin de "alumno"
Oracle permite conceder mltiples privilegios a mltiples usuarios en una misma sentencia,
debemos separarlos por comas.
En el siguiente ejemplo se concede el permiso para crear sesin a los usuarios "juan" y "ana":
grant create sesion
to juan, ana;
En el siguiente ejemplo se conceden los permisos para crear tablas y vistas al usuario "ana":
grant create table, create view
to ana;
Consultamos el diccionario "dba_sys_privs" para ver los privilegios concedidos a "ana" y "juan":
select grantee, privilege from dba_sys_privs
where grantee='ANA' or grantee='JUAN'
order by grantee; Obtenemos la siguiente informacin:
GRANTEE
PRIVILEGE
------------------------------ANA
CREATE VIEW
ANA
CREATE PROCEDURE
ANA
CREATE TRIGGER
ANA
CREATE SESSION
ANA
CREATE TABLE
JUAN
CREATE SESSION
JUAN
CREATE PROCEDURE
JUAN
CREATE TRIGGER
Iniciamos una nueva sesin como "ana". Como "ana" creamos una tabla:
create table prueba(
nombre varchar2(30),
apellido varchar2(30)
);
Iniciamos una nueva sesin como "juan". Como "juan" intentamos crear una tabla:
create table prueba(
nombre varchar2(30),
apellido varchar2(30)
);
Mensaje de error "privilegios insuficientes". Esto sucede porque "juan", no tiene permiso para crear
tablas.
Vemos los permisos de "juan":
select privilege from user_sys_privs;
Note que hay una tabla propiedad de "ana" y otra que pertenece a "juan".
Primer problema:
Una escuela necesita crear 3 usuarios diferentes en su base de datos. Uno denominado "director",
otro "profesor" y otro "estudiante". Luego se les concedern diferentes permisos para retringir el
acceso a los diferentes objetos. Conctese como administrador (por ejemplo "system").
1- Cree un usuario denominado "director", con contrasea "escuela", asignndole 100M de espacio
en "system" (100M). Antes elimnelo por si existe:
2- Intente iniciar una sesin como "director". No es posible, no hemos concedido el permiso
correspondiente. Aparece un mensaje indicando que el usuario "director" no tiene permiso "create
session" por lo tanto no puede conectarse.
Mensaje de error "privilegios insuficientes". Esto sucede porque "profesor" NO tiene permiso para
crear tablas.
16- Consulte los permisos de "profesor"
No tiene permiso para crear tablas, nicamente para crear sesin.
17- Cambie a la conexin de administrador y conceda a "profesor" permiso para crear tablas
18- Cambie a la sesin de "profesor" y cree una tabla
Ahora si podemos hacerlo, "profesor" tiene permiso "create table".
19- Consulte nuevamente los permisos de "profesor"
Tiene permiso para crear tablas y para crear sesin.
20- Inicie una sesin como "estudiante" e intente crear una tabla:
create table prueba(
nombre varchar2(30),
apellido varchar2(30)
);
Mensaje de error "no existen privilegios en tablespace SYSTEM". Esto sucede porque "estudiante",
si bien tiene permiso para crear tablas, no tiene asignado espacio (recuerde que al crearlo no
especificamos "quota", por lo tanto, por defecto es cero).
21- Vuelva a la conexin de "administrador" y consulte todas las tablas denominadas "PRUEBA"
Note que hay una tabla propiedad de "director" y otra que pertenece a "profesor".
En el siguiente ejemplo, concedemos el permiso de crear tablas al usuario "juan" y con "with admin
option", el usuario "juan" podr conceder este permiso de crear tablas a otros usuarios:
grant create table
to juan
with grant option;
Podemos consultar el diccionario "dba_sys_privs" para encontrar los privilegios concedidos a los
usuarios. Nos mostrar una tabla con las siguientes columnas:
- grantee: el nombre del usuario,
- privilege: el permiso y
- admin_option: si el permiso adquirido puede ser cedido a otros o no, YES o NO.
Tabla
ALTER
DELETE
Vista
Secuencia
Procedure
X
X
EXECUTE
INDEX
INSERT
REFERECES
SELECT
UPDATE
X
X
Problema:
El usuario ana crea una tabla de nombre libros de la siguiente forma:
create table libros(
codigo number(5) not null,
titulo varchar2(40) not null,
autor varchar2(20) default 'Desconocido',
editorial varchar2(20),
edicion date,
precio number(6,2)
);
ana concede a juan todos los privilegios sobre libros a todos los usuarios, incluyendo a los que se
crean despus de ejecutar esta orden:
grant all on libros to public;
ana concede a juan sobre visitas para que se pueda modificar slo la columna pais:
grant update (pais) on visitas to juan;
Con la opcin with grant option se puede dar al usuario que recibe los privilegios el privilegio para
que l pueda concederlos a otros. Ana concede a juan privilegio para insertar en tabla1 y, adems,
para que l pueda pasar este privilegio a otros usuarios:
grant insert on tabla1 to juan with grant option;
Problema 1 :
dni
nombre
direccin
telefono
calif examen
calif ejercicios
calif clase
Retirada de privilegios
Al igual que se conceden privilegios, se pueden retirar. Para eso sirve la orden SQL REVOQUE,
que retira privilegios o roles concedidos a los usuarios y privilegios concedidos a los roles. El
formato para retirar privilegios de objetos a los usuarios o roles es:
REVOKE {priv_objeto [,priv_objeto] | ALL [PRIVILEGES]}
ON [usuario.]objeto
FROM {usuario|rol|PUBLIC} [,{usuario | rol | PUBLIC}] ...;
Y el formato para retirar privilegios de sistema o roles a usuarios o para retirar privilegios a roles es
el siguiente:
REVOKE {priv_sistema | rol} [,{priv_sistema | rol}] ...
FROM {usuario | rol | PUBLIC} [usuario | rol | PUBLIC}] ...;
Ejemplo:
el usuario MILAGROS retira los privilegios SELECT y UPDATE sobre TABLA1 al usuario
FRANCISCO:
REVOKE SELECT, UPDATE ON TABLA1 FROM FRANCISCO;
Roles
Supongamos que un conjunto de usuarios del departamento de contabilidad requiere el mismo
conjunto de privilegios para trabajar con ciertos datos. Este conjunto de privilegios se puede
agrupar en un rol, de tal manera que es posible asignar el mismo rol a cada uno de los usuarios. Un
rol es un conjunto de privilegios que recibe un nombre comn para facilitar la tarea de asignacin
de stos a los usuarios o a otros roles. En primer lugar creamos el rol con la orden SQL CREATE
ROLE y, a continuacin, asignamos privilegios con la orden GRANT. El formato para crear un rol
es:
CREATE ROLE NombreRol;
El usuario podr conectarse a la base de datos y hacer SELECT e INSERT en la tabla EMPLE, e
INSERT en la tabla DEPART.
Se pueden aadir privilegios al rol ejecutando otra orden GRANT. Por ejemplo, aadimos el
privilegio SELECT sobre la tabla DEPART al rol creado anteriormente:
GRANT SELECT ON DEPART TO PRUEBA;
Actividad
Crea un usuario y concdele el rol creado (PRUEBA). Aade el privilegio CREATE TALE al rol.
Consulta los privilegios del sistema que tiene asignados el usuario creado.
objetos. Supongamos que el usuario creado anteriormente puede crear vistas (tiene el privilegio
CREATE VIEW). Tambin puede hacer SELECT en la tabla EMPLE, ya que tienen asignado el rol
ACCESO. Pero no puede crear una vista sobre la tabla EMPLE debido a que recibi el privilegio
SELECT a travs del rol ACCESO.
Supresin de un rol
La orden drop role permite eliminar un rol de la base de datos. Oracle retira el rol concedido a todos
los usuarios y roles a los que se les concedi. Para poder eliminar un rol es necesario ser
administrador o tener el privilegio DROP ANY ROL. ste es el formato:
DROP ROLE NombreRol;
Por ejemplo, para eliminar el rol ACCESO escribimos: DROP ROLE ACCESO;
Perfiles
Un perfil es un conjunto de lmites a los recursos de la base de datos. Se pueden utilizar perfiles
para poner lmites a la cantidad de recursos del sistema y de la base de datos disponibles para un
usuario y para gestionar las restricciones de contrasea.