Je vais repartir du début et tenter de vous expliquer mes triggers et ce qu'ils sont censés faire.
Depuis le début (et pourquoi je n'ai pas mis l'erreur précise), ce ne sont que des syntaxes erreurs les problèmes viennent bien d'ici.
DROP TRIGGER Check_Update_Delete_Service ON Service;
CREATE TRIGGER Check_Update_Delete_Service
BEFORE UPDATE OR DELETE ON Activite
FOR EACH ROW
EXECUTE PROCEDURE Check_Service();
CREATE OR REPLACE FUNCTION Check_Activite() RETURNS TRIGGER AS $$
BEGIN
IF (TG_OP = 'UPDATE') THEN
IF (SELECT s.idproprio FROM Service s, Activite a WHERE s.idservice=a.idservice AND a.idservice=OLD.idservice AND a.idproprio = USER IS NOT NULL) THEN
RETURN NEW;
ELSE
RETURN OLD;
END IF;
ELSIF (TG_OP = 'DELETE') THEN
IF (SELECT s.idproprio FROM Service s, Activite a WHERE s.idservice=a.idservice AND a.idservice=OLD.idservice AND a.idproprio = USER IS NOT NULL) THEN
RETURN OLD;
ELSE
RETURN NULL;
END IF;
END IF;
END;
$$ language plpgsql;
Commençons donc par cette fonction et son trigger associé.
Le trigger donc est un BEFORE et va lancer la fonction qui exécutera ou pas le Update ou Delete.
Le but de la fonction Check_Activite() est donc :
- si c'est un Update, elle va vérifier que le propriétaire du service est bien l'utilisateur connecté :
Je voudrais juste que si la requête renvoie rien, ce qui signifie que il essaye de modifier une ligne ne lui appartenant pas, cela ne fasse pas l'Update.
Sinon dans le cas où la la requête renvoie quelque chose, cela Update
- si c'est un Delete , de même, que cela ne valide que si la requête renvoie au moins une ligne, d'où mon IS NULL
CREATE TABLE Service (
idservice INTEGER,
idproprio VARCHAR(20) NOT NULL,
nom VARCHAR(50) NOT NULL,
prix FLOAT NOT NULL check (prix>0),
datedebut DATE NOT NULL,
datefin DATE NOT NULL check (datedebut<datefin),
nbpersonne INTEGER NOT NULL check (nbpersonne > 0),
saison SAISON NOT NULL,
image varchar(50),
description VARCHAR(255) NOT NULL,
ville varchar(20) NOT NULL,
codepostal INTEGER NOT NULL,
pays PAYS NOT NULL,
PRIMARY KEY (idservice),
FOREIGN KEY (ville, codepostal, pays) REFERENCES Lieu(nomville, codepostal, pays),
FOREIGN KEY (idproprio) REFERENCES Professionnel(idclient)
);
CREATE TABLE Activite (
idservice INTEGER,
typeactivite TYPEACTIVITE NOT NULL,
heuredebut TIME NOT NULL,
heurefin TIME NOT NULL,
PRIMARY KEY (idservice),
FOREIGN KEY (idservice) REFERENCES Service(idservice)
);
Voici mes deux tables Activite et Service.
Message édité par MrVhek le 12-12-2014 à 16:00:50