MySQL通过触发器防止某一列的数据修改

标签 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 KEY上加上了ON UPDATE NO ACTION。我想要类似的行为。

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

我不知道我做错了什么。

我通过 XAMPP 使用 phpmyadmin

  • 服务器类型:MariaDB
  • 服务器版本:10.1.21-MariaDB - mariadb.org 二进制发行版

最佳答案

尝试:

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

关于MySQL通过触发器防止某一列的数据修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45110911/

相关文章:

更新后的 MySQL 触发器 - 如果列不为空则更新

postgresql - 如何使 PostgreSQL 约束仅适用于新值

mysql - SQL更新执行顺序有关系吗?

java - 从 Java 在 MySQL 中创建临时表

mysql - 计数准确的地方不多或少 mysql

javascript - JSON 编码 MySQL 数组并在 Google map 上显示

php - 如果否则在更新查询中不起作用

php - 如何管理用户访问和用户权限

sql-server - SQL Server 触发器 - 按事务分组

mysql - 使用 UPDATE 时转义 mysql 语句中的特殊字符