在MariaDB上创建事务以设置ip黑名单的到期时间

时间:2018-07-18 22:16:41

标签: sql mariadb

我用来帮助建立此事务的问题在这里:
How to add 1 hour to currrent_timestamp in mysql which is the default value?

我正在尝试在数据库中创建事务以填充mariadb数据库表allowed中的blacklisted_ips列。我希望allowed列比我的added列晚一个小时,该列的默认值为CURRENT_TIMESTAMP。到目前为止,这是我的交易:

CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips FOR EACH ROW BEGIN
SET NEW.allowed=NOW()+INTERVAL 1 HOUR;
END;

我收到的错误消息如下:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 2

这是我的表模式:

CREATE TABLE blacklisted_ips (
    ip_id int(11) NOT NULL AUTO_INCREMENT,
    ip_add varchar(15) NOT NULL,
    added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
    allowed timestamp NOT NULL,
    PRIMARY KEY (ip_id)
);

1 个答案:

答案 0 :(得分:1)

在MySQL中,终止;语句的CREATE TRIGGER与终止触发器主体中的各个语句的可能的;字符之间存在歧义。

您得到的错误令人困惑:

  

#1064-您的SQL语法有错误;检查与您的MariaDB服务器版本相对应的手册以获取正确的语法,以在第2行的''附近使用

通常,语法错误包括语句后跟语法解析器混淆的位置的文本。但是对于您而言,它在;上感到困惑,认为这是CREATE TRIGGER语句的结尾。因此,错误发生在终端处;就解析器而言,错误之后没有文本。

同一问题影响CREATE PROCEDURECREATE FUNCTION

为解决歧义,MySQL客户端支持builtin command来更改DELIMITER,因此您可以将其更改为与例程主体中出现的任何字符序列不同的名称。

DELIMITER ;;
CREATE TRIGGER before_insert_on_blacklisted_ips BEFORE INSERT ON blacklisted_ips 
FOR EACH ROW BEGIN
  SET NEW.allowed=NOW()+INTERVAL 1 HOUR;
END ;;

或者,由于在您的情况下,该触发器是单语句触发器,因此根本不需要BEGIN...END块。这样,您可以跳过更改DELIMITER的操作,因为终止;的{​​{1}}与终止触发器的单个语句的CREATE TRIGGER相同。

;

P.S .:此处记录了一个示例:https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html