2016-07-01 54 views
0

是否有可能爲MySQL觸發器提供密碼? 我需要在BEFORE INSERT觸發器中加密我的數據並在視圖中對其進行解密。 也許有辦法將它存儲在當前會話中?MySQL觸發服務密碼

或者是數據庫層中的en-和解密一般是壞主意?

非常感謝=)

+0

如果密碼是用於登錄認證iterated-salted-hasing是currect方法不加密。 – zaph

回答

0

考慮下面的觸發和事件

模式:

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,應用程序)中創建一個用戶變量(一個帶有@符號),則插入觸發器會將其選中。與之一起玩的是顯示的Event,它在具有自己的連接的單獨線程中運行,並且它自己的用戶變量@theVar的實例。他們不會相互干擾或相互覆蓋。

LINE A1以上可以重複運行,以顯示事件不會覆蓋我們的用戶變量,因爲,它有它自己的。

對於具有用戶變量的存儲過程與觸發器一樣,情況也是如此。如果已設置用戶變量@theVar,則該變量可用。