suchen

Heim  >  Fragen und Antworten  >  Hauptteil

MySQL-Trigger vor der Datenvalidierung

Ich möchte einen Trigger erstellen, der einige Daten validiert, bevor Zeilen in die Tabelle eingefügt werden. Ich habe drei Tische:

Tischpersonal:

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`))

Tabellenbenutzer:

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

und Tabellenanmerkung:

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

Damit nur Benutzer, die zu Personen gehören, Kommentare einfügen können, habe ich versucht, den nächsten Auslöser zu implementieren:

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

Die Idee ist, die Peronnel-ID aus der Benutzertabelle abzurufen und, wenn sie leer ist, nichts in die Tabelle einzufügen, aber ich kann es nicht zum Laufen bringen

P粉558478150P粉558478150240 Tage vor336

Antworte allen(1)Ich werde antworten

  • P粉550823577

    P粉5508235772024-03-30 00:58:23

    您已经处于在 Notas 上插入的触发器中,因此如果没有理由取消它,就让它通过。

    在将某些内容与 NULL 进行比较时,还可以使用 IS NULLIS NOT NULL。不要使用 =!=,因为 NULL 不是等于或不等于任何值的值。 IE。 NULL = 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

    Antwort
    0
  • StornierenAntwort