开发者

mysql triggers simulating assertions

开发者 https://www.devze.com 2023-02-07 19:13 出处:网络
Let’s consider table Video( IDvideo(PK), Date, Description, User ) with mysql I have no way of writing assertions.

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 开发者_StackOverflow中文版(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?


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...

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号