Mysql
 sql >> Base de données >  >> RDS >> Mysql

déclencheurs mysql simulant des assertions

Eh bien, le problème est que MySQL n'a pas d'équivalent d'une STOP ACTION commande. Donc, fondamentalement, les contournements sont assez sales :

Une façon consiste à violer une contrainte à l'intérieur du déclencheur pour générer une erreur et annuler l'insertion :

CREATE TABLE stop_action (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(35),
    UNIQUE KEY (id, name)
);
INSERT INTO stop_action (1, 'Assert Failure');

Ensuite, dans le déclencheur, essayez simplement :

INSERT INTO stop_action (1, 'Assert Failure');

L'avantage de cela est que l'erreur renvoyée sera une erreur de clé en double et que le texte inclura "Assert Failure".

Alors votre déclencheur deviendrait :

delimiter |

CREATE TRIGGER asser1_before BEFORE INSERT ON test1
  FOR EACH ROW BEGIN
    SELECT count(*) INTO test FROM (select count(*)
          from Video  
          where Date >= DATE_SUB(current_date(),INTERVAL  1 YEAR ) 
            && Date<=current_date()  
          group by User   
          having count(*) > 200);
    IF test != 0 THEN
        INSERT INTO stop_action (1, 'Assert Failure');
    END IF;
  END;
|

delimiter ;

Maintenant, vous devez le faire avant UPDATE ainsi, sinon vous pourriez mettre à jour la date dans un état invalide. Mais sinon, cela devrait au moins vous aider à démarrer...