我有'用户'表格包含以下字段: - user_id(int,auto increment PK) encrypted_userid(varchar 50) user_name(varchar 50) user_location(varchar 50)
我想要做的是创建一个触发器,以便在将users表插入user_name和user_location时,我希望使用来自user_id的AES_ENCRYPTED值填充encrypted_userid字段 - 例如AES_ENCRYPT(user_id,' MYAESKEY')但仅适用于新插入的行
这是否可以在MySQL中使用某种触发器?
提前致谢。
答案 0 :(得分:0)
我使用MySQL - Trigger for updating same table after insert(JCLG' s条目)解决了我的问题
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;
答案 1 :(得分:0)
那么我的问题有一个解决方案,不会失败等吗?使用触发器 - 我尝试阅读其他来源的所有其他解决方案都没有用。
所有解决方案都围绕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);