最近在使用mysql 8的過程中,遇到了無法創建觸發器的問題。經過一番研究和實踐,發現這是因為mysql 8對于安全性的提升而做出的修改所導致的。
在mysql 8之前,創建觸發器無需驗證函數、過程等對象是否存在,但是在mysql 8中,為了加強安全性,必須在創建觸發器之前驗證是否存在相關對象。這就導致了在mysql 8中創建觸發器時出現錯誤。
DELIMITER $$ CREATE TRIGGER test_trigger BEFORE INSERT ON test_table FOR EACH ROW BEGIN INSERT INTO test_log(msg) VALUES('test'); END$$ DELIMITER ;
上述代碼在mysql 8中會出現以下錯誤:“Error Code: 1305. FUNCTION test.test_log does not exist”。這是因為mysql 8要求在創建觸發器之前,必須確保test.test_log存在。如果test.test_log不存在,則需要先創建它,然后再創建觸發器。
DELIMITER $$ CREATE TABLE IF NOT EXISTS test_log ( id INT AUTO_INCREMENT PRIMARY KEY, msg VARCHAR(255) NOT NULL )$$ DELIMITER ; DELIMITER $$ CREATE TRIGGER test_trigger BEFORE INSERT ON test_table FOR EACH ROW BEGIN INSERT INTO test_log(msg) VALUES('test'); END$$ DELIMITER ;
通過上述代碼,在創建觸發器之前先創建了test_log表,然后再創建test_trigger觸發器,就可以順利創建觸發器了。
總之,在mysql 8中創建觸發器時,要特別注意驗證觸發器依賴的函數、過程、表等對象是否存在,以免出現錯誤。