自定义MariaDB警告不会引发,但会引发相同的错误

93ze6v8z  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(124)

我试图创建一个自定义警告,可以由MariaDB数据库中的触发器引发,但由于某种原因,我无法显示它。相关代码(简化和模糊)如下:

CREATE TABLE my_table (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    data VARCHAR(255),
);

DELIMITER //
CREATE TRIGGER warn_bad_cause
BEFORE INSERT ON my_table
FOR EACH ROW
BEGIN
    IF (NEW.data LIKE 'bad data')
    THEN
        SIGNAL SQLSTATE '01000' 
        SET MESSAGE_TEXT = 'bad data';
    END IF;
END //
DELIMITER ;

尝试插入应触发警告的值时,不会发生任何情况。例如,在一个示例中,

> INSERT INTO my_table (data) VALUES ('bad data');
Query OK, 1 row affected (0.013 sec)

> SHOW WARNINGS;
Empty set (0.000 sec)

但是,如果我将SQLSTATE更改为error(例如,45000),我会使用相同的查询得到一个错误:

> INSERT INTO my_table (data) VALUES ('bad data');
Query OK, 1 row affected (0.013 sec)
ERROR 1644 (45000): bad data
Error (Code 1644): bad data

> SHOW WARNINGS;
+-------+------+----------+
| Level | Code | Message  |
+-------+------+----------+
| Error | 1644 | bad data |
+-------+------+----------+

我尝试过的事情:

  • \W显示警告
  • 使用sql_errlog插件检查日志
  • log_warnings级别从2(默认值)一直增加到9
  • 在触发器中设置特定的mysql_errno

我们将不胜感激。

ej83mcc0

ej83mcc01#

看起来你好像碰到了一只虫子。以01(warnings)开头的SIGNAL SQLSTATE在存储过程内部或外部执行时引发警告,但不会在触发器内部引发警告,如示例所示。

MariaDB [test]> SIGNAL SQLSTATE '01000';
Query OK, 0 rows affected, 1 warning (0.000 sec)

MariaDB [test]> DELIMITER $$
MariaDB [test]> CREATE OR REPLACE PROCEDURE p1()
    -> BEGIN
    ->   SIGNAL SQLSTATE '01000';
    -> END $$
Query OK, 0 rows affected (0.013 sec)

MariaDB [test]> call p1()$$
Query OK, 0 rows affected, 1 warning (0.000 sec)

我在MariaDB的跟踪系统中提交了一个问题:MDEV-31940

相关问题