sql - PostgreSQL from E-R to correct trigger -
i have e-r diagram: i've done sql translation, , have written relationship way:
create domain origine varchar(6) default null check (value ='upload' or value = 'link'); create table progetto.utente ( id_utente varchar(4) check (id_utente ‘u%’), primary key (id_utente), username varchar(20) not null unique ); create index progetto.idx_utente_id_utente on progetto.utente (id_utente); create table progetto.bacheca ( id_bacheca varchar(4) check (id_bacheca ‘b%’), id_proprietario varchar(4) not null, primary key (id_bacheca), foreign key (id_proprietario) references progetto.utente (id_utente) on update cascade on delete cascade, titolo varchar(20) not null, n_follower int ); create table progetto.immagine ( id_img varchar(4) check (id_img ‘i%’), primary key (id_img), origine origine, descrizione varchar(20) default null, bacheca varchar(4) not null, foreign key (bacheca) references progetto.bacheca (id_bacheca) on update cascade on delete cascade, possessore varchar(4) not null, foreign key (possessore) references progetto.utente (id_utente) on update cascade on delete cascade n_pin int not null, n_like int not null, n_preferiti int not null, id_preferito varchar (20) not null foreign key (id_preferito) references progetto.utente (id_utente) on update cascade on delete cascade ); create table progetto.topic ( id_topic varchar(4) check (id_topic ‘t%’), primary key (id_topic), nome varchar(20) not null ); create table progetto.correlazione ( immagine varchar(4) not null, foreign key (immagine) references progetto.immagine (id_img) on update cascade on delete cascade, topic varchar(20) not null, foreign key (topic) references progetto.topic (id_topic) on update cascade on delete cascade, primary key (immagine, topic) ); create table progetto.pin ( utente varchar(4) not null, foreign key (utente) references progetto.utente (id_utente) on update cascade on delete cascade, immagine varchar(20) not null, foreign key (immagine) references progetto.immagine (id_img) on update cascade on delete cascade, primary key (utente, immagine) ); create table progetto.likes ( utente varchar(4) not null, foreign key (utente) references progetto.utente (id_utente) on update cascade on delete cascade, immagine varchar(20) not null, foreign key (immagine) references progetto.immagine (id_img) on update cascade on delete cascade, primary key (utente, immagine) ); create table progetto.followbacheca ( utente varchar(4) not null, foreign key (utente) references progetto.utente (id_utente) on update cascade on delete cascade, bacheca varchar(4) not null, foreign key (bacheca) references progetto.bacheca (id_bacheca) on update cascade on delete cascade, primary key (utente, bacheca) ); create table progetto.followutenti ( follower varchar(4), foreign key (follower) references progetto.utente (id_utente) on update cascade on delete cascade, followed varchar(4), foreign key (followed) references progetto.utente (id_utente) on update cascade on delete cascade, primary key (follower, followed) ); create table progetto.affinità ( topic1 varchar(4) not null, foreign key (topic1) references progetto.topic (id_topic) on update cascade on delete cascade, topic2 varchar(4) not null, foreign key (topic2) references progetto.topic (id_topic) on update cascade on delete cascade, primary key (topic1, topic2) );
note: attributes in italic foreign keys, bold primary keys.
- utente (id_utente, username)
- bacheca (id_bacheca, id_proprietario, titolo, n_follower)
- immagine (id_img, origine, descrizione, bacheca , possessore, n_pin, n_like, n_preferiti, id_preferito ) origine ∈ {upload, link} descrizione can null
- topic (id_topic, nome)
- correlazione ( immagine , topic )
- pin ( utente , immagine )
- likes ( utente , immagine )
- followbacheca ( utente , bacheca )
- followutenti (follower, followed )
- attinenza (topic1, topic2 )
now i've got problem. want, when delete "utente" (user) "immagine" in relashionship "possesso" with, deleted if "immagine"'s origine 'link'.
i think have use trigger, i'm not able write 1 it. suggestions?
ps: i'm sorry italian names.
yes, should solve trigger. first though, should delete on delete cascade
clause immagine
table:
possessore varchar(4) not null references progetto.utente on update cascade
the trigger function delete in table immagine
, if origine = 'link'
, there no row in table pin
links image user. note assumes there 1 immagine per utente.
create function progetto.delete_immagine_origine_link() returns trigger $$ declare id_immagine varchar(4); org origine; begin -- check if immagine linked utente select id_img, origine id_immagine, org progetto.immagine possessore = old.id_utente; if found -- there row, if origine wrong, fail delete if org != 'link' return null; end if; -- check if there pin row links immagine utente perform * progetto.pin utente = old.id_utente , immagine = id_immagine; if found return null; -- there link, fail delete end if; -- safe delete row immagine delete progetto.immagine id_img = id_immagine; end if; -- either there no immagine utente or has been deleted -- safe delete utente return old; end; $$ language plpgsql;
the trigger should defined on utente
table:
create trigger delete_from_utente before delete on progetto.utente each row execute procedure progetto.delete_immagine_origine_link();
Comments
Post a Comment