【问题标题】:mysql trigger to update one field of the newly added rowmysql触发器更新新添加行的一个字段
【发布时间】:2015-02-11 05:17:27
【问题描述】:

我有包含以下字段的“用户”表:- user_id (int, 自增 PK) encrypted_userid (varchar 50) 用户名(varchar 50) user_location (varchar 50)

我想要做的是创建一个触发器,以便当将值插入用户表中的用户名和用户位置时,我想使用来自用户 ID 的 AES_ENCRYPTED 值填充加密用户 ID 字段 - 例如AES_ENCRYPT(user_id,'MYAESKEY') 但仅适用于新插入的行

这在 MySQL 中是否可以通过某种触发器实现?

提前致谢。

【问题讨论】:

  • 是否需要创建触发器?
  • 您可以在插入行的同时插入 AES_ENCRYPTED 值。
  • 我需要尝试这样做,因为当前插入用户表的三个网站中的页面数将永远改变,所以我认为使用触发器可能更容易,由于 encrypted_userid 将成为一个新字段,因此我可以根据现有 user_id 值更新新字段,但是一旦新字段上线,我需要为以后的条目执行此操作

标签: mysql triggers


【解决方案1】:

我使用MySQL - Trigger for updating same table after insert(JCLG 的条目)解决了我的问题

CREATE TRIGGER `useridinserttrigger` BEFORE INSERT ON `users` 
FOR EACH ROW BEGIN
    DECLARE tmpid,tmpid2 INT(11);
    SELECT user_id INTO tmpid FROM users ORDER BY user_id DESC LIMIT 1;     
    SET tmpid2=tmpid+1;
    SET new.encrypted_userid=AES_ENCRYPT(tmpid2,'MYAESKEY'); 

END;

【讨论】:

  • 我希望你知道这个解决方案在负载下会惨遭失败。此外,在您的情况下,它会通过获取不正确的 id 并产生损坏的值而静默失败。
  • 那么有没有解决我的问题不会失败等的方法?使用触发器 - 我从阅读其他来源尝试的所有其他解决方案都不起作用。
【解决方案2】:

那么有没有解决我的问题不会失败等?使用触发器 - 我尝试阅读其他来源的所有其他解决方案都不起作用。

所有解决方案都围绕LAST_INSERT_ID(),因为它是唯一多用户安全的方式来获取自动生成的 ID。


第一种可能的方法,如果您非常喜欢触发器,则为自动生成的序列设置一个单独的表。您的架构将如下所示

CREATE TABLE users_seq (user_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT);
CREATE TABLE users
(
  user_id INT NOT NULL PRIMARY KEY DEFAULT 1, 
  encrypted_userid varchar(50), 
  user_name varchar(50), 
  user_location varchar(50),
  FOREIGN KEY user_id_fk (user_id) REFERENCES users_seq (user_id)
);

还有触发器

DELIMITER //
CREATE TRIGGER useridinserttrigger
BEFORE INSERT ON users
FOR EACH ROW
BEGIN
  INSERT INTO users_seq() VALUES();
  SET NEW.user_id = LAST_INSERT_ID(),
      NEW.encrypted_userid = AES_ENCRYPT(LAST_INSERT_ID(), 'MYAESKEY');
END//
DELIMITER ;

第二种方法是利用现有架构但使用存储过程

DELIMITER //
CREATE PROCEDURE insert_user(IN _name VARCHAR(50), IN _location VARCHAR(50))
BEGIN
  DECLARE _id INT;

  START TRANSACTION;
  INSERT INTO users (user_name, user_location) VALUES(_name, _location);
  SET _id = LAST_INSERT_ID();
  UPDATE users 
     SET encrypted_userid = AES_ENCRYPT(_id, 'MYAESKEY')
   WHERE user_id = _id;
  COMMIT;
END//
DELIMITER ;

示例用法:

CALL insert_user('johndoe', null);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多