MySQL使用触发器

时间:2017-07-14 20:11:02

标签: mysql triggers sql-update

我正在尝试阻止在更新中修改列。我有一个名为created_at的列,它是一个时间戳,但我想锁定它。

我尝试创建BEFORE UPDATE TRIGGER但没有成功。

DROP TRIGGER IF EXISTS Users_creation_update_exception;
DELIMITER //
CREATE TRIGGER Users_creation_update_exception
BEFORE UPDATE
ON `Users` FOR EACH ROW

    IF NEW.created_by <> (SELECT created_by FROM `Users` WHERE id = NEW.id LIMIT 1) THEN
        SIGNAL SQLSTATE '45000'; // It says error here
    END IF;

END//
DELIMITER ;

我不知道触发器是否是解决此类问题的正确答案。我已经加了FORIGN KEYON UPDATE NO ACTION。我想要一个类似的行为。

我在MySQL documentationSIGNAL页面中查找了相关信息。在MariaDB SIGNAL page上也是如此。

我不知道自己做错了什么。

我通过XAMPP与

一起使用phpmyadmin
  • 服务器类型:MariaDB
  • 服务器版本:10.1.21-MariaDB - mariadb.org二进制分发

1 个答案:

答案 0 :(得分:2)

尝试:

MariaDB [_]> SELECT VERSION();
+----------------+
| VERSION()      |
+----------------+
| 10.2.7-MariaDB |
+----------------+
1 row in set (0.00 sec)

MariaDB [_]> DROP TABLE IF EXISTS `Users`;
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> CREATE TABLE IF NOT EXISTS `Users` (
    ->   `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    ->   `created_by` DATETIME NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> DROP TRIGGER IF EXISTS `Users_creation_update_exception`;
Query OK, 0 rows affected, 1 warning (0.00 sec)

MariaDB [_]> DELIMITER //

MariaDB [_]> CREATE TRIGGER `Users_creation_update_exception`
    -> BEFORE UPDATE ON `Users`
    -> FOR EACH ROW
    -> BEGIN
    ->   IF TRUE THEN
    ->     SIGNAL SQLSTATE '45000'
    ->       SET MESSAGE_TEXT = 'An error occurred';
    ->   END IF;
    -> END//
Query OK, 0 rows affected (0.00 sec)

MariaDB [_]> DELIMITER ;

MariaDB [_]> INSERT INTO `Users`
    -> VALUES (NULL, NOW());
Query OK, 1 row affected (0.00 sec)

MariaDB [_]> UPDATE `Users` SET `created_by` = NOW();
ERROR 1644 (45000): An error occurred