Bases de Datos - 2006 Ejemplos: Integridad y Seguridad

Anuncio
Bases de Datos - 2006
Ejemplos: Integridad y
Seguridad
Restricciones de los dominios
Un DNI tiene hasta 6 dı́gitos y es mayor que
cero.
create domain DNItype numeric(6,0)
constraint value-test check(value > 0)
Una posición puede ser: “egresado”, “docente”
o “alumno”.
create domain postype varchar(8)
constraint postype-test
check(value in (’egresado’,’docente’,
’alumno’))
1
La antigüedad es un número entre 0 y 40.
create domain antigtype numeric(2,0)
constraint antigtype-test
check(value betweeen 0 and 40)
Integridad referencial
Integridad referencial de inscripto-en con socio
y biblioteca.
create table inscripto-en
(nombre-biblioteca varchar(30) not null,
DNI integer not null,
primary key (DNI,nombre-biblioteca),
foreign key (DNI) references socio
foreign key (nombre-biblioteca)
references biblioteca
check (DNI > 0))
2
Integridad referencial de inscripto-en con socio
y biblioteca y si se borra/actualiza una tupla
en biblioteca, se hace borrado/actualización en
cascada en inscripto-en. Si se borra una tupla en socio, se hace borrado en cascada en
inscripto-en.
create table inscripto-en
(nombre-biblioteca varchar(30) not null,
DNI integer not null,
primary key (DNI,nombre-biblioteca),
foreign key (DNI) references socio
on delete cascade
foreign key (nombre-biblioteca)
references biblioteca
on delete cascade
on update cascade
check (DNI > 0))
3
Aserciones
Todo socio que es bibliotecario es un egresado.
create assertion bibSocEgr check
(not exists (select * from socio, bibliotecario
where socio.DNI = bibliotecario.DNI
and posicion <> ”egresado”))
Todo socio está inscripto en al menos una biblioteca.
create assertion socInscBib check
(not exists (select * from socio
where (not exists(
select *
from inscripto-en
where socio.DNI =
inscripto-en.DNI)))
4
Disparadores
Cada vez que se da ingreso a un bibliotecario
a una biblioteca, se lo hace socio de esa biblioteca.
create trigger hacerSocioBibliotecario
after insert on trabaja-en
referencing new row as nrow
for each row
begin atomic
insert into socio values
( ”egresado”, nrow.DNI )
insert into inscripto-en values
( nrow.nombre-biblioteca, nrow.DNI )
end
5
Supongamos que guardamos el año actual en
una relación año actual de una tupla de un
número y que solo actualizamos ese número.
Cada vez que se actualiza el año-actual, se
incrementa la antigüedad de los bibliotecarios
en la cantidad de años que corresponda.
create trigger actualizarAntiguedades
after update on año-actual
referencing new row as nrow, old row as orow
for each row
update bibliotecario
set antiguedad = case
when nrow - orow > 0
then antiguedad + nrow - orow
else antiguedad + orow - nrow
6
Autorización
Los socios de una biblioteca pueden consultar
las relaciones libro-biblioteca y prestado-a.
create role socioBib
grant select on libro-biblioteca to socioBib
grant select on prestado-a to socioBib
Los bibliotecarios están autorizados a hacer las
cosas que pueden hacer los socios.
create role bibliotecarioBib
grant socioBib to bibliotecarioBib
Los bibliotecarios pueden prestar libros, registrar devoluciones de libros, consultar préstamos,
consultar, ingresar o eliminar socios, consultar
e ingresar libros a la biblioteca.
grant select, delete, insert on prestado-a
to bibliotecarioBib
7
grant insert on persona
to bibliotecarioBib
grant insert on socios
to bibliotecarioBib
grant select, insert, delete on inscripto-en
to bibliotecarioBib
grant insert on libro
to bibliotecarioBib
grant select, insert on libro-autor
to bibliotecarioBib
grant select, insert on libro-biblioteca
to bibliotecarioBib
Hay un administrador de la base de datos que
tiene todos los privilegios sobre bibliotecario y
todos los privilegios sobre biblioteca.
create role administrador
grant all privileges on bibliotecario to administrador
grant all privileges on biblioteca to administrador
8
Darle a Juan Durán el rol de socio y a Luis
Pérez el rol de bibliotecario.
grant socioBib to Juan Durán
grant bibliotecarioBib to Luis Pérez
9
Descargar