【问题标题】:MySQL Trigger serve passwordMySQL 触发器服务密码
【发布时间】:2016-11-03 21:57:58
【问题描述】:

是否有可能为 MySQL 触发器提供密码? 我需要它在 BEFORE INSERT 触发器中加密我的数据并在视图中解密它。 也许有办法将它存储在当前会话中?

或者说数据库层中的加密和解密通常是个坏主意?

非常感谢 =)

【问题讨论】:

  • 如果密码是用于登录验证,迭代-salted-hasing是当前的方法而不是加密。

标签: mysql encryption view triggers passwords


【解决方案1】:

考虑以下触发器和事件

架构:

CREATE SCHEMA triggerTest;
USE triggerTest;

DROP TABLE IF EXISTS account;
CREATE TABLE account 
(   id INT auto_increment PRIMARY KEY,
    acct_num INT NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    insertDT DATETIME NOT NULL,
    updtBy VARCHAR(100) NULL -- user (or 'EVENTx' see below) that did the last insert
)ENGINE=InnoDB;

插入触发器:

DROP TRIGGER IF EXISTS acctBefInsTrig;
DELIMITER $$
CREATE TRIGGER acctBefInsTrig BEFORE INSERT ON account
FOR EACH ROW
BEGIN
    SET NEW.updtBy = @theVar;
END;$$
DELIMITER ;

事件:

DROP EVENT IF EXISTS `myEvt001`;
DELIMITER $$
CREATE EVENT myEvt001
  ON SCHEDULE EVERY 1 MINUTE STARTS '2016-01-01 00:00:00'
  ON COMPLETION PRESERVE
DO
  BEGIN
    SET @theVar='myEvt001';
    INSERT account(acct_num,amount,insertDT) VALUES (102,2000,NOW());
  END $$
DELIMITER ;

测试:

SHOW VARIABLES WHERE variable_name='event_scheduler';
SET GLOBAL event_scheduler = ON;

SET @theVar='Joe'; -- run this only once
SELECT @theVar; -- LINE A1
INSERT account(acct_num,amount,insertDT) VALUES (102,1000,NOW());

SELECT * FROM account; -- watch the Event put a new row in every minute

SET GLOBAL event_scheduler = OFF;
SELECT * FROM account;
+----+----------+---------+---------------------+----------+
| id | acct_num | amount  | insertDT            | updtBy   |
+----+----------+---------+---------------------+----------+
|  1 |      102 | 2000.00 | 2016-08-08 14:03:00 | myEvt001 |
|  2 |      102 | 1000.00 | 2016-08-08 14:03:17 | Joe      |
|  3 |      102 | 2000.00 | 2016-08-08 14:04:00 | myEvt001 |
|  4 |      102 | 1000.00 | 2016-08-08 14:04:27 | Joe      |
+----+----------+---------+---------------------+----------+

清理:

DROP SCHEMA triggerTest;

简短的叙述。如果我在一个用户连接(MySQL Workbench,一个应用程序)中创建一个用户变量(一个带有 @ 符号的变量),那么插入触发器将拾取它。与之配合的是显示的事件,它在一个单独的线程中运行,它有自己的连接和它自己的用户变量@theVar 的实例。它们不会相互干扰或相互覆盖。

上面的LINE A1 可以重复运行以显示事件不会覆盖我们的用户变量,因为它有自己的。

对于带有用户变量的存储过程和触发器也是如此。如果设置了用户变量@theVar,则可用。

【讨论】:

    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 2011-05-24
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多