2017-07-14 73 views
0

我试图防止在更新中修改列。我有一个名为created_at的列,它是一个时间戳,但我想锁定它。MySQL防止在一列中使用触发器修改数据

我试图创建一个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 a ON UPDATE NO ACTION。我想要一个类似的行为。

我查找了SIGNAL页面的信息MySQL documentationMariaDB SIGNAL page也是如此。

我不知道我在做什么错。

我在phpmyadmin的通过XAMPP与

  • 服务器类型:MariaDB的
  • Server版本:21年1月10日,MariaDB的 - mariadb.org二进制分发

回答

1

尝试:

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 
+0

我可以看到,我忘了写'BEGIN' – Chax

+0

我会尽快更新,只要我回家。那么我会给你回馈。 – Chax

+0

它的方式。抱歉耽搁了。 – Chax

相关问题