J'ai de l'étiquette '2 tables et « musicien »déclenchement Oracle sur les valeurs varchar ne fonctionne pas
CREATE TABLE label
(labId varchar(10) NOT NULL PRIMARY KEY,
labName varchar(20) NOT NULL
);
CREATE TABLE musician
(musId varchar(10) NOT NULL PRIMARY KEY,
musName varchar(30) NOT NULL,
labId varchar(10) NOT NULL,
CONSTRAINT MusLabel FOREIGN KEY (labId) REFERENCES label(labId)
);
J'ai créé un déclencheur pour limiter le nombre de musiciens une étiquette peut avoir dans une plage de 1 à 5 ; de sorte que, par exemple une étiquette x ne peut pas avoir 6 musiciens:
CREATE OR REPLACE TRIGGER before_musician_insert
BEFORE INSERT ON musician
FOR EACH ROW
DECLARE
total integer;
BEGIN
SELECT COUNT(*) INTO total
FROM musician, label
WHERE musician.labId=label.labId;
IF (total < 0 OR total > 5)
THEN
DBMS_OUTPUT.PUT_LINE('Invalid');
END IF;
END;
/
Lorsque j'insère un 6 musicien dans la table avec le même ID d'étiquette, l'instruction d'insertion ne « déclencheur » TRIGGER et la 6e valeur ajoutée à la table. Je ne sais pas comment résoudre ce problème. J'ai essayé une contrainte de vérification, mais avec des valeurs varchar, cela ne fonctionne pas non plus.
J'apprécie votre aide.
Votre déclencheur n'a aucun sens. Tout d'abord, c'est sur la table des musiciens, mais vous décrivez le problème en tant qu'étiquettes. –
Est-ce que c'est pour une classe où vous devez utiliser un déclencheur? Ce n'est pas une bonne utilisation pour un déclencheur (en particulier si vous prévoyez d'avoir plusieurs utilisateurs) et l'exigence n'a pas beaucoup de sens - que se passe-t-il si une étiquette veut signer un 6ème musicien? Si vous voulez vraiment imposer ce genre de chose, vous feriez mieux de changer le modèle de données. –
@Justin Cave oui c'est une affectation pour une classe en fait. Je me demandais si je pouvais utiliser une contrainte de vérification dans ce cas, et si oui comment? – omar