Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql triggers simulando assertivas


Bem, o problema é que o MySQL não tem um equivalente de STOP ACTION comando. Então, basicamente, as soluções alternativas são bastante sujas:

Uma maneira é que você pode violar uma restrição dentro do gatilho para criar um erro e cancelar a inserção:
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');

Então, no gatilho, é só tentar:
INSERT INTO stop_action (1, 'Assert Failure');

A vantagem disso é que o erro retornado será um erro de chave duplicada e o texto incluirá "Falha de declaração".

Então, seu gatilho se tornaria:
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 ;

Agora, você precisa fazer isso antes de UPDATE também, caso contrário você pode atualizar a data para um estado inválido. Mas, caso contrário, isso deve pelo menos começar...