Rajout de Trigger pour la BDD
continuous-integration/drone/push Build is passing Details

master
brongniart 3 months ago
parent 41b600ff20
commit 75c761d040

@ -502,10 +502,10 @@ VALUES
('Here is looking at you, kid.', 'Casablanca', 'Gone with the Wind', 'Citizen Kane', 'The Maltese Falcon', 'Casablanca'); ('Here is looking at you, kid.', 'Casablanca', 'Gone with the Wind', 'Citizen Kane', 'The Maltese Falcon', 'Casablanca');
-- INSERTION TABLE Quiz -- INSERTION TABLE Quiz
INSERT INTO Quiz (title,img,nb_quest) INSERT INTO Quiz (title,img)
VALUES VALUES
('Titre du quiz n°1',56,4), ('Titre du quiz n°1',56),
('Titre du quiz n°1',100,5); ('Titre du quiz n°1',100);

@ -14,12 +14,15 @@ DROP TABLE IF EXISTS Users;
DROP TABLE IF EXISTS Image; DROP TABLE IF EXISTS Image;
-- Création des tables -- Création des tables
-------------------------------------------------------------------------
CREATE TABLE Image( CREATE TABLE Image(
id_img NUMERIC PRIMARY KEY, id_img NUMERIC PRIMARY KEY,
imgPath varchar(100) NOT NULL UNIQUE imgPath varchar(100) NOT NULL UNIQUE
); );
-------------------------------------------------------------------------
CREATE TABLE Users( CREATE TABLE Users(
id_user SERIAL PRIMARY KEY, id_user SERIAL PRIMARY KEY,
username varchar(50) NOT NULL, username varchar(50) NOT NULL,
@ -31,11 +34,63 @@ CREATE TABLE Users(
CONSTRAINT fk_img FOREIGN KEY(img) REFERENCES Image(id_img) CONSTRAINT fk_img FOREIGN KEY(img) REFERENCES Image(id_img)
); );
Create OR REPLACE Function IfUserIsAdmin() RETURNS trigger AS $$
DECLARE
BEGIN
Delete From Admin
where users = OLD.id_user;
RETURN NEW;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER IfUserIsAdmin ON Users;
Create Trigger IfUserIsAdmin BEFORE DELETE on Users
FOR EACH ROW
EXECUTE FUNCTION IfUserIsAdmin();
Create OR REPLACE Function DeleteUserFavorite() RETURNS trigger AS $$
DECLARE
BEGIN
Delete From Favorite
where users = OLD.id_user;
RETURN NEW;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER DeleteUserFavorite ON Users;
Create Trigger DeleteUserFavorite BEFORE DELETE on Users
FOR EACH ROW
EXECUTE FUNCTION DeleteUserFavorite();
Create OR REPLACE Function DeleteUserCommentary() RETURNS trigger AS $$
DECLARE
BEGIN
Delete From Commentary
where users = OLD.id_user;
RETURN NEW;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER DeleteUserCommentary ON Users;
Create Trigger DeleteUserCommentary BEFORE DELETE on Users
FOR EACH ROW
EXECUTE FUNCTION DeleteUserCommentary();
-------------------------------------------------------------------------
CREATE TABLE Admin( CREATE TABLE Admin(
users SERIAL PRIMARY KEY, users SERIAL PRIMARY KEY,
CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user) CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user)
); );
-------------------------------------------------------------------------
CREATE TABLE Question( CREATE TABLE Question(
id_question SERIAL PRIMARY KEY, id_question SERIAL PRIMARY KEY,
texte text NOT NULL UNIQUE, texte text NOT NULL UNIQUE,
@ -47,14 +102,34 @@ CREATE TABLE Question(
CONSTRAINT check_cAnswer CHECK (cAnswer = answerA OR cAnswer = answerB OR cAnswer = answerC OR cAnswer = answerD) CONSTRAINT check_cAnswer CHECK (cAnswer = answerA OR cAnswer = answerB OR cAnswer = answerC OR cAnswer = answerD)
); );
-------------------------------------------------------------------------
CREATE TABLE Quiz( CREATE TABLE Quiz(
id_quiz SERIAL PRIMARY KEY, id_quiz SERIAL PRIMARY KEY,
title varchar(40) NOT NULL, title varchar(40) NOT NULL,
img NUMERIC NOT NULL, img NUMERIC NOT NULL,
nb_quest numeric, nb_quest numeric Default 0,
CONSTRAINT fk_img FOREIGN KEY(img) REFERENCES Image(id_img) CONSTRAINT fk_img FOREIGN KEY(img) REFERENCES Image(id_img)
); );
Create OR REPLACE Function DeleteQuiz() RETURNS trigger AS $$
DECLARE
BEGIN
Delete From Quiz_Question
where quiz=OLD.id_quiz;
Delete From Record_quiz
where quiz=OLD.id_quiz;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER DeleteQuiz ON Quiz;
Create Trigger DeleteQuiz BEFORE DELETE on Quiz
FOR EACH ROW
EXECUTE FUNCTION DeleteQuiz();
-------------------------------------------------------------------------
CREATE TABLE Quiz_Question( CREATE TABLE Quiz_Question(
quiz SERIAL NOT NULL, quiz SERIAL NOT NULL,
question SERIAL NOT NULL, question SERIAL NOT NULL,
@ -63,11 +138,42 @@ CREATE TABLE Quiz_Question(
CONSTRAINT fk_question FOREIGN KEY(question) REFERENCES Question(id_question) CONSTRAINT fk_question FOREIGN KEY(question) REFERENCES Question(id_question)
); );
Create OR REPLACE Function NombreQuestionQuiz() RETURNS trigger AS $$
DECLARE
nb numeric;
BEGIN
IF TG_OP=DELETE Then
SELECT count(quiz) INTO nb
FROM Quiz_Question
WHERE quiz = OLD.quiz;
Else
SELECT count(quiz) INTO nb
FROM Quiz_Question
WHERE quiz = NEW.quiz;
End IF;
Update Quiz
set nb_quest=nb
where id_quiz=NEW.quiz;
Return NEW;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER NombreQuestionQuiz ON Quiz_Question;
Create Trigger NombreQuestionQuiz AFTER INSERT UPDATE DELETE on Quiz_Question
FOR EACH ROW
EXECUTE FUNCTION NombreQuestionQuiz();
-------------------------------------------------------------------------
CREATE TABLE Record_quiz( CREATE TABLE Record_quiz(
users SERIAL NOT NULL, users SERIAL NOT NULL,
quiz SERIAL NOT NULL, quiz SERIAL NOT NULL,
nbPoint numeric DEFAULT '0', nbPoint numeric DEFAULT 0,
timeQ numeric DEFAULT '0', timeQ numeric DEFAULT 0,
PRIMARY KEY (users, quiz), PRIMARY KEY (users, quiz),
CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user), CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user),
CONSTRAINT fk_quiz FOREIGN KEY(quiz) REFERENCES Quiz(id_quiz), CONSTRAINT fk_quiz FOREIGN KEY(quiz) REFERENCES Quiz(id_quiz),
@ -75,18 +181,24 @@ CREATE TABLE Record_quiz(
CONSTRAINT err_timeQ CHECK(timeQ >= 0) CONSTRAINT err_timeQ CHECK(timeQ >= 0)
); );
-------------------------------------------------------------------------
CREATE TABLE Source( CREATE TABLE Source(
id_source SERIAL PRIMARY KEY, id_source SERIAL PRIMARY KEY,
title varchar(100) NOT NULL, title varchar(100) NOT NULL,
dateS numeric(4) NOT NULL dateS numeric(4) NOT NULL
); );
-------------------------------------------------------------------------
CREATE TABLE Caracter( CREATE TABLE Caracter(
id_caracter SERIAL PRIMARY KEY, id_caracter SERIAL PRIMARY KEY,
caracter varchar(100) NOT NULL, caracter varchar(100) NOT NULL,
id_img NUMERIC NOT NULL id_img NUMERIC NOT NULL
); );
-------------------------------------------------------------------------
CREATE TABLE Quote( CREATE TABLE Quote(
id_quote SERIAL PRIMARY KEY, id_quote SERIAL PRIMARY KEY,
content text NOT NULL, content text NOT NULL,
@ -104,11 +216,106 @@ CREATE TABLE Quote(
CONSTRAINT err_language CHECK (langue = 'fr' OR langue = 'en') CONSTRAINT err_language CHECK (langue = 'fr' OR langue = 'en')
); );
Create OR REPLACE Function DeleteQuoteBEFORE() RETURNS trigger AS $$
DECLARE
BEGIN
Delete From Favorite
where quote=OLD.id_quote;
Delete From Commentary
where quote=OLD.id_quote;
If OLD.id_quote in (Select citation_id From DailyQuote) Then
Update from DailyQuote
set citation_id = (Select id_quote
From Quote
Where id_quote!=OLD.id_quote
ORDER BY RAND()
LIMIT 1)
Where citation_id=OLD.id_quote;
END IF;
Return NEW;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER DeleteQuoteBEFORE ON Quote;
Create Trigger DeleteQuoteBEFORE BEFORE DELETE on Quote
FOR EACH ROW
EXECUTE FUNCTION DeleteQuoteBEFORE();
Create OR REPLACE Function DeleteQuoteAFTER() RETURNS trigger AS $$
DECLARE
nb numeric;
BEGIN
Select count(id_caracter) into nb
from Quote
where id_caracter=OLD.id_caracter;
IF nb <= 1 Then
Delete from Caracter
where id_caracter=OLD.id_caracter;
END IF;
Select count(id_source) into nb
from Quote
where id_source=OLD.id_source;
IF nb <= 1 Then
Delete from Source
where id_source=OLD.id_source;
END IF;
Return NEW;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER DeleteQuoteAFTER ON Quote;
Create Trigger DeleteQuoteAFTER AFTER DELETE on Quote
FOR EACH ROW
EXECUTE FUNCTION DeleteQuoteAFTER();
-------------------------------------------------------------------------
CREATE TABLE DailyQuote( CREATE TABLE DailyQuote(
citation_id INT PRIMARY KEY, citation_id INT PRIMARY KEY,
FOREIGN KEY (citation_id) REFERENCES Quote(id_quote) ON DELETE CASCADE FOREIGN KEY (citation_id) REFERENCES Quote(id_quote) ON DELETE CASCADE
); );
Create OR REPLACE Function UniqueDailyQuote() RETURNS trigger AS $$
DECLARE
nb numeric;
BEGIN
Select count(*) into nb
from DailyQuote;
IF nb = 0 Then
INSERT INTO DailyQuote (citation_id)
VALUES( (Select id_quote
From Quote
Where id_quote!=OLD.id_quote
ORDER BY RAND()
LIMIT 1) );
ELIF nb>1
DELETE From DailyQuote
where citation_id!=NEW.citation_id;
END IF;
END;
$$ LANGUAGE plpgsql ;
DROP TRIGGER UniqueDailyQuote ON DailyQuote;
Create Trigger UniqueDailyQuote AFTER INSERT DELETE on DailyQuote
FOR EACH ROW
EXECUTE FUNCTION UniqueDailyQuote();
-------------------------------------------------------------------------
CREATE TABLE Favorite( CREATE TABLE Favorite(
users SERIAL NOT NULL, users SERIAL NOT NULL,
@ -118,6 +325,8 @@ CREATE TABLE Favorite(
CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user) CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user)
); );
-------------------------------------------------------------------------
CREATE TABLE Commentary( CREATE TABLE Commentary(
id_comment SERIAL PRIMARY KEY, id_comment SERIAL PRIMARY KEY,
quote SERIAL NOT NULL, quote SERIAL NOT NULL,
@ -128,3 +337,5 @@ CREATE TABLE Commentary(
CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user) CONSTRAINT fk_user FOREIGN KEY(users) REFERENCES Users(id_user)
); );
-------------------------------------------------------------------------

Loading…
Cancel
Save