mysql triggers simulating assertions

若如初见. 提交于 2019-12-08 04:51:11

问题


Let’s consider table

Video(
    IDvideo(PK),
    Date,
    Description,
    User
)

with mysql I have no way of writing assertions. Is it possible to simulate the following assertion using one or more triggers ?

create assertion asser1  
check (0 = 
    ( select count(*)  
      from Video  
      where Date >= DATE_SUB(current_date(),INTERVAL  1 YEAR ) 
          && Date<=current_date()  
      group by User   
      having count(*) > 200
    )
)

how should I write that trigger?


回答1:


Well, the problem is that MySQL doesn't have an equivalent of a STOP ACTION command. So basically, the work arounds are quite dirty:

One way is that you can violate a constraint inside the trigger to bubble an error and cancel the insert:

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');

Then, in the trigger, just try to:

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

The benefit of that, is that the error that's returned will be a duplicate key error, and the text will include "Assert Failure".

So then your trigger would become:

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 ;

Now, you'd need to do this before UPDATE as well, otherwise you could update the date into an invalid state. But otherwise, that should at least get you started...



来源:https://stackoverflow.com/questions/4866757/mysql-triggers-simulating-assertions

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!