Maison  >  Questions et réponses  >  le corps du texte

Déclencheur MySQL avant de valider les données

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粉558478150P粉558478150203 Il y a quelques jours309

répondre à tous(1)je répondrai

  • P粉550823577

    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 NULLIS 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

    répondre
    0
  • Annulerrépondre