Maison > Questions et réponses > le corps du texte
Je souhaite créer un déclencheur qui valide certaines données avant d'insérer des lignes dans le tableau. J'ai trois tables :
Personnel de table :
CREATE TABLE IF NOT EXISTS `mydb`.`Personal` ( `IdPersonal` INT NOT NULL, `ApePaterno` VARCHAR(60) NOT NULL, `ApeMaterno` VARCHAR(60) NULL, `Nombre` VARCHAR(60) NOT NULL, `Direccion` VARCHAR(100) NOT NULL, `FechaDeIngreso` DATE NOT NULL, PRIMARY KEY (`IdPersonal`))
Utilisateur de la table :
CREATE TABLE IF NOT EXISTS `mydb`.`Usuarios` ( `idUsuario` INT NOT NULL, `Nombre` VARCHAR(45) NOT NULL, `Contrasenia` VARCHAR(45) NOT NULL, `IdPersonal` INT NULL, PRIMARY KEY (`idUsuario`), INDEX `fk_Usuario_Personal_idx` (`IdPersonal` ASC) VISIBLE, CONSTRAINT `fk_Usuario_Personal` FOREIGN KEY (`IdPersonal`) REFERENCES `mydb`.`Personal` (`IdPersonal`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB
et annotation du tableau :
CREATE TABLE IF NOT EXISTS `mydb`.`Notas` ( `idNota` INT NOT NULL, `Nota` VARCHAR(256) NOT NULL, `IdUsuario` INT NOT NULL, PRIMARY KEY (`idNota`), INDEX `fk_IdUsuario_idx` (`IdUsuario` ASC) VISIBLE, CONSTRAINT `fk_IdUsuario` FOREIGN KEY (`IdUsuario`) REFERENCES `mydb`.`Usuarios` (`idUsuario`) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB
Ainsi, seuls les utilisateurs appartenant à des personnes peuvent insérer des commentaires, j'ai donc essayé d'implémenter le déclencheur suivant :
CREATE DEFINER=`root`@`localhost` TRIGGER `Notas_BEFORE_INSERT` BEFORE INSERT ON `Notas` FOR EACH ROW BEGIN DECLARE IdInterno INT; SELECT IdPersonal INTO IdInterno FROM Usuarios WHERE idUsuario = new.IdUsuario; IF (IdInterno != null) THEN INSERT INTO Notas (Nota, IdUsuario) VALUES (new.Nota, new.IdUsuario); ELSE SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Las notas sólo pueden ser registradas por usuarios internos'; END IF; END
L'idée est d'obtenir l'identifiant Peronnel de la table des utilisateurs et si elle est vide alors n'insérez rien dans la table mais je n'arrive pas à le faire fonctionner
P粉5508235772024-03-30 00:58:23
Vous êtes déjà dans le déclencheur inséré sur Notas, donc s'il n'y a aucune raison de l'annuler, laissez-le passer.
Il est également possible d'utiliser IS NULL
或 IS NOT NULL
。不要使用 =
或 !=
,因为 NULL 不是等于或不等于任何值的值。 IE。 NULL = NULL
de manière incorrecte lors de la comparaison de quelque chose à NULL.
CREATE DEFINER=`root`@`localhost` TRIGGER `Notas_BEFORE_INSERT` BEFORE INSERT ON `Notas` FOR EACH ROW BEGIN DECLARE IdInterno INT; SELECT IdPersonal INTO IdInterno FROM Usuarios WHERE idUsuario = new.IdUsuario; IF (IdInterno IS NULL) THEN SIGNAL SQLSTATE '50001' SET MESSAGE_TEXT = 'Las notas sólo pueden ser registradas por usuarios internos'; END IF; END