插入前触发时MySQL更改类型

时间:2016-06-30 09:38:34

标签: mysql triggers insert aes

我希望MySQL能够自动使用AES加密数据,因此我没有在应用程序层中执行此操作。第一个问题:这甚至可能吗? 我试过这个简单的方法:

表:

measurement
id INT
value VARBINARY(50)

触发:

CREATE DEFINER = CURRENT_USER TRIGGER `openeHealth`.`measurement_BEFORE_INSERT` BEFORE INSERT ON `measurement` FOR EACH ROW
BEGIN
    SET @@session.block_encryption_mode = 'aes-256-ecb';
    DECLARE vKey = RANDOM_BYTES(256);
    SET NEW.value HEX(AES_ENCRYPT(value, vKey));
END

这是我第一次尝试使用触发器,所以可能是一个简单的失败,或者MySQL不支持这样的东西。

我的testinsert的Double值为'value'。

是的,我知道我需要将随机密钥存储在某个地方。所以也许有人知道如何更新另一个表,因为“之前插入”到?

非常感谢

错误讯息:

ERROR: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.., 1)' at line 1
SQL Code:
    INSERT INTO `openeHealth`.`measurement` (`id`, `owner_id`, `type_id`, `value`, `device_id`) VALUES (1, 1, 1, ..., 1)

生成的MySQL Workbench代码:

START TRANSACTION;
USE `openeHealth`;
INSERT INTO `openeHealth`.`measurement` (`id`, `owner_id`, `type_id`, `value`, `device_id`) VALUES (1, 1, 1, ..., 1);

COMMIT;

1 个答案:

答案 0 :(得分:0)

  

14.6.3 DECLARE Syntax

     

...

     

仅允许在BEGIN ... END复合语句中使用DECLARE   并且必须在任何其他陈述之前开始。

     

...

尝试:

mysql> DROP TABLE IF EXISTS `measurement`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `measurement`(
    ->   `id` INT,
    ->   `value` VARBINARY(50)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER //

mysql> CREATE DEFINER=CURRENT_USER TRIGGER `measurement_BEFORE_INSERT` BEFORE INSERT ON `measurement`
    -> FOR EACH ROW
    -> BEGIN
    ->   DECLARE `SESSION_block_encryption_mode` VARCHAR(33) DEFAULT @@SESSION.`block_encryption_mode`;
    ->   -- SET @@session.block_encryption_mode = 'aes-256-ecb';
    ->   -- DECLARE vKey = RANDOM_BYTES(256);
    -> 
    ->   SET @@SESSION.`block_encryption_mode` := 'aes-256-ecb';
    -> 
    ->   -- SET NEW.value HEX(AES_ENCRYPT(value, vKey));
    ->   SET NEW.`value` := HEX(AES_ENCRYPT(NEW.`value`, RANDOM_BYTES(256)));
    ->   SET @@SESSION.`block_encryption_mode` := `SESSION_block_encryption_mode`;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

mysql> INSERT INTO `measurement`
    ->   (`id`, `value`)
    -> VALUES
    ->   (1, 'myKey');
Query OK, 1 row affected (0.00 sec)

mysql> SELECT
    ->   `id`,
    ->   `value`
    -> FROM
    ->   `measurement`;
+------+----------------------------------+
| id   | value                            |
+------+----------------------------------+
|    1 | 10293FC4F42FC7BAAA91C94EFF004315 |
+------+----------------------------------+
1 row in set (0.00 sec)