我正在尝试阻止在更新中修改列。我有一个名为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 KEY
个ON UPDATE NO ACTION
。我想要一个类似的行为。
我在MySQL documentation的SIGNAL
页面中查找了相关信息。在MariaDB SIGNAL
page上也是如此。
我不知道自己做错了什么。
我通过XAMPP与
一起使用phpmyadmin答案 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