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