sql - PostgreSQL from E-R to correct trigger -


i have e-r diagram: 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

Popular posts from this blog

matlab - error with cyclic autocorrelation function -

django - (fields.E300) Field defines a relation with model 'AbstractEmailUser' which is either not installed, or is abstract -

c# - What is a good .Net RefEdit control to use with ExcelDna? -