2016-07-04 7 views
0

を修正するために、私は、このERダイアグラムを持っている:E-R Diagram 私はSQLの翻訳を行ってきた、と私はすべての関係をこのように書かれている:PostgreSQLは、トリガー

CREATE DOMAIN origine 
AS VARCHAR(6) DEFAULT NULL 
CHECK (value ='upload' or value = 'link'); 

CREATE TABLE progetto.Utente (
ID_Utente VARCHAR(4) check (ID_Utente like ‘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 like ‘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 like ‘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 like ‘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) 
); 

注:イタリックの属性があります外部キー、太字主キー。

  • Utente(ID_Utente、ユーザー名)
  • Bacheca(ID_BachecaID_Proprietario、Titolo、N_follower)
  • イマジン(ID_img、原産地、する説明、BachecaPossessore、N_pin、N_like、N_preferiti、ID_Preferito)原点∈{UPLOAD、LINK} De scrizioneトピック(ID_topic、ノーム)
  • Correlazione(イマジン、トピック
  • ピン(Utente、イマジン
  • いいね!(Utente、
  • NULLとすることができますイマジン
  • FollowBacheca(Utente、Bacheca
  • FollowUtenti(フォロワーは、今、私は問題を持っている
  • Attinenza(Topic1、Topic2

を追いました。私は、 "Immagine"のOrigineが "link"の場合にのみ、それが削除されることを "Utente"(User)が "Immagine"のRelationhip "Possesso"で削除した場合に削除したいと思います。

私はトリガーを使用する必要があると思いますが、それを行う人は書き込めません。 提案がありますか?

PS:イタリア語の名前は申し訳ありません。

答えて

0

はい、これをトリガーで解決する必要があります。まずしかし、あなたはImmagineテーブルからON DELETE CASCADE句を削除する必要があります。

possessore varchar(4) NOT NULL REFERENCES progetto.Utente ON UPDATE CASCADE 

origine = 'link'場合トリガー機能は、テーブルImmagineで削除を行い、ユーザに画像をリンクテーブルPinには行がありません。これは、Utenteごとに1つのImmagineしか存在しないことを前提としています。

CREATE FUNCTION progetto.delete_immagine_origine_link() RETURNS trigger AS $$ 
DECLARE 
    id_immagine varchar(4); 
    org   origine; 
BEGIN 
    -- Check if an Immagine is linked to the Utente 
    SELECT ID_Img, Origine INTO id_immagine, org 
    FROM progetto.Immagine 
    WHERE possessore = OLD.ID_Utente; 
    IF FOUND THEN 
     -- There is a row, but if the origine is wrong, fail the delete 
     IF org != 'link' THEN 
      RETURN NULL; 
     END IF; 

     -- Now check if there is a Pin row that links Immagine to Utente 
     PERFORM * FROM progetto.Pin 
     WHERE Utente = OLD.ID_Utente AND Immagine = id_immagine; 
     IF FOUND THEN 
      RETURN NULL; -- There is a link, fail the delete 
     END IF; 

     -- It is safe to delete the row from Immagine 
     DELETE FROM progetto.Immagine 
     WHERE ID_Img = id_immagine; 
    END IF; 

    -- Either there was no Immagine for the Utente or it has been deleted 
    -- so safe to delete Utente 
    RETURN OLD; 
END; 
$$ LANGUAGE plpgsql; 

自体がUtente、テーブルの上に定義されている必要がありトリガー

CREATE TRIGGER delete_from_utente 
    BEFORE DELETE ON progetto.Utente 
    FOR EACH ROW EXECUTE PROCEDURE progetto.delete_immagine_origine_link(); 
+0

Mmが...それはその作業です。 「Immagine」がUtenteとの「ピン」関係に入ってはいけないという保証を追加したいのですが? – user3004162

+0

「ピン関係にない」とはどういう意味ですか? 'N_pin'は数値です。 'N_pin = 0'、そうでなければ削除しないという意味ですか? – Patrick

+0

NOT ピン(有効、イマジン) – user3004162

関連する問題