ursus contionabundo: 2. Funktionierende Lösung: Procedur und Trigger ( + mehrere Tests + Regex )

Beitrag lesen

Das könnte an deinem SQL-Server liegen.

Ja. Mein Tisch gibt die Form meiner Stirn schon wieder ... Ich hatte tatsächlich einen alten MySql-5.7-Server (Eine virtuelle Maschine, gemacht für ein Seminar) am Start.

Ich hab die Geschichte um einen weiteren Fehler und um einen regulären Ausdruck erweitert. Geht mit Mysql 5.7 und Mariadb 10.0:

CREATE TABLE `tabelle` ( `spalte` VARCHAR( 100 ) NOT NULL );

DELIMITER $
  
CREATE PROCEDURE `check_tabelle`(IN `spalte` varchar( 100 ) )
    BEGIN
        IF `spalte` LIKE "" THEN
            SIGNAL SQLSTATE '45000'
            SET MESSAGE_TEXT = 'spalte was empty';
        END IF;
        
        SET @test = `spalte` REGEXP '[A-Za-z]{4}';
        IF NOT @test THEN
            SIGNAL SQLSTATE '45001'
            SET MESSAGE_TEXT = 'Spalte was to short (Minimum: 4 chars [A-Za-z])';
        END IF;        
    END
$
 
CREATE TRIGGER `tabelle_before_insert` BEFORE INSERT ON `tabelle`
    FOR EACH ROW
    BEGIN
        CALL check_tabelle(new.spalte);
    END
$   

CREATE TRIGGER `tabelle_before_update` BEFORE UPDATE ON `tabelle`
    FOR EACH ROW
    BEGIN
        CALL check_tabelle(new.spalte);
    END
$   

DELIMITER ;

INSERT INTO `tabelle` ( spalte ) values ( "foobar" );
INSERT INTO `tabelle` ( spalte ) values ( "foo" );
INSERT INTO `tabelle` ( spalte ) values ( "" );
"foobar" : Query OK, 1 row affected (0,00 sec)
"foo"    : ERROR 1644 (45001): Spalte was to short (Minimum: 4 chars [A-Za-z])
""       : ERROR 1644 (45000): spalte was empty

Das werde ich jetzt mal sorgfältig als Beispiel verwahren…