jueves, 24 de marzo de 2011

Desarrollo de Triggers en SQLite

SQLITE NO IMPLEMENTA NATIVAMENTE INTEGRIDAD RELACIONAL PERO PUEDE LOGRARSE DEFINIENDO TRIGGERS, EN INSERCIÓN, ACTUALIZACIÓN Y BORRADO. VEAMOS UN EJEMPLO CON VARIAS TABLAS

=========================================================
La tabla PELICULAS tiene dependencia de otras dos:
GENERO y  SOPORTE.

Los triggers antes de insert y antes de update
on Peliculas tienen en cuenta estas dos dependencias.

Para antes de delete hacen falta dos triggers:
uno en Genero y otro en Soporte.
Estos triggers impiden que se pueda borrar un
genero o un soporte, si hay peliculas que lo están
usando.
El código deja claro lo que se haría si la
dependencia fuera de más tablas,sólo habría que
añadir más OR  y los triggers on delete.

Si la dependencia fuera solo de una tabla,se
quitaría un OR y el delete que sobre.

[Editar]==============================================

CREATE TABLE [genero] (
[id_gen] INTEGER  PRIMARY KEY NOT NULL,
[nombreGen] VARCHAR(40) UNIQUE NOT NULL
);

CREATE TABLE [soporte] (
[id_sop] INTEGER  NOT NULL PRIMARY KEY,
[nombreSop] VARCHAR(20)  UNIQUE NOT NULL
);

CREATE TABLE [peliculas] (
[id_pel] INTEGER  NOT NULL PRIMARY KEY,
[id_genero] INTEGER  NOT NULL,
[id_soporte] INTEGER  NOT NULL,
[nombrePel] VARCHAR(40)  NOT NULL
);



CREATE TRIGGER film_pel_in before insert on peliculas
for each row 
begin
select case
when
(
(new.id_soporte is not null) 
 and 
 (new.id_genero is not null) 
  and
 (
  ((select id_sop from soporte where
    id_sop =new.id_soporte) is null)
   or
   ((select id_gen from genero where
     id_gen = new.id_genero) is null)
                  )
)
then raise(abort,'violacion integridad')
end;
end;

CREATE TRIGGER film_pel_up before update on peliculas

for each row begin
select case
when
(
((select id_sop from soporte where
 id_sop = new.id_soporte) is null)
 or
((select id_gen from genero where
 id_gen = new.id_genero) is null)
)
then raise(abort,'violacion integridad')
end;
end;

CREATE TRIGGER film_sop_de before delete on soporte

for each row begin
select case
when
((select id_soporte from peliculas
 where id_soporte = old.id_sop) is not null)
 then raise(abort,'violacion integridad')
 end;
 end;

CREATE TRIGGER film_gen_de before delete on genero
for each row begin
select case
when
((select id_genero from peliculas
 where id_genero = old.id_gen) is not null)
then raise(abort,'violacion integridad')
end;
end;
Fuente: http://www.elserver.com/wiki/SQLite_relacionar_tablas_con_triggers

No hay comentarios:

Publicar un comentario