Delete en tablas: titulacion. Puedo eliminar cualquier fila de una tabla? Restriccion de integridad: Restrict/Cascade
Ojo: Titulacion se relaciona con Asignatura, y a la vez Asignatura se relaciona con Alumnoasignatura… Que pasa si esta en Cascada?....: Tanto Titulacion como Asignatura.
create PROCEDURE numeric(6)) AS if exists (select * from titulacion where begin DELETE titulacion WHERE return 0 end else return 1
int print 'Se elimino registro en titulacion' else print 'no existe la titulacion a eliminar'
Si solo esta en cascada Titulacion y no Asignatura (por diseño y reglas de negocio)… Tenemos 2 opciones:
1.- Forzamos la eliminacion en alumnoasignatura.
create PROCEDURE numeric(6)) AS numeric(6) if exists (select * from titulacion where begin if exists (select * from alumnoasignatura, asignatura, titulacion where alumnoasignatura.idasignatura=asignatura.idasignatura and begin delete alumnoasignatura where idasignatura in (select idasignatura from asignatura where DELETE titulacion WHERE return 0 end else begin DELETE titulacion WHERE return 0 end else return 1
int print 'Se elimino registro en titulacion' else print 'no existe la titulacion a eliminar'
Otra forma de hacer lo mismo: llamamos a otro procedimiento almacenado dentro del que ejecutamos.
create PROCEDURE numeric(6)) AS numeric(6) if exists (select * from titulacion where begin if exists (select * from alumnoasignatura, asignatura, titulacion where alumnoasignatura.idasignatura=asignatura.idasignatura and begin exec DELETE titulacion WHERE return 0 end else begin DELETE titulacion WHERE return 0 end else return 1
create procedure borraralasig numeric(6)) as delete alumnoasignatura where idasignatura in (select idasignatura from asignatura where
int print 'Se elimino registro en titulacion' else print 'no existe la titulacion a eliminar'
2.- Simplemente no se puede eliminar el registro en alumnoasignatura.
create PROCEDURE numeric(6)) AS numeric(6) if exists (select * from titulacion where begin if exists (select * from alumnoasignatura, asignatura, titulacion where alumnoasignatura.idasignatura=asignatura.idasignatura and return 2 else begin DELETE titulacion WHERE return 0 end else return 1
int print 'Se elimino registro en titulacion' else print 'no existe la titulacion a eliminar' print 'no se puede eliminar la titulacion ya que tiene ramos inscritos'
Podemos guardar los datos eliminados??
Se elimina una titulacion y se guarda id y nombre, ademas del usuario que elimino y la fecha… Se asume delete on cascade…
Creamos la tabla para guardar los datos: create table auditoriatit (cod SMALLINT IDENTITY(1,1) NOT NULL primary key, idtit numeric(6), nombre varchar (20), usuario varchar (20), fecha datetime)
create PROCEDURE numeric(6)) AS varchar(20) if exists (select * from titulacion where begin from titulacion where from titulacion where insert into auditoriatit (idtit, nombre, usuario, fecha) user, getdate()) DELETE titulacion WHERE return 0 end else return 1
int print 'Se elimino registro en titulacion y se hizo backup' else print 'no existe la titulacion a eliminar'
select * from auditoriatit
Podria hacerse la insercion a auditoria llamando a otro procedimiento almacenado dentro del actual…
Insert, Update, Delete…se pueden hacer con el Asistente de SQL SERVER.