關於mysql中觸發器執行動態sql的問題

2021-05-09 15:05:57 字數 1382 閱讀 8452

這幾天手頭開發的系統要做乙個類似windows賬戶到期時間的功能,考慮了半天想出了乙個技術上和邏輯上都還能實現的解決方案:

建立乙個使用者存入資料庫的時候都建立乙個事件排程器來控制使用者的到期時間(mysql的時間排程器確實很方便)。想起來是很簡單,但是做起來問題確實一波接一波...

一些小問題就不說了,到了關鍵的地方了:在插入乙個使用者的時候我到底是在應用層來新增乙個事件排程器呢還是在資料庫裡面自動新增。

當然不管從**的美觀上、系統設計的思想上或是執行效率上來說,我都應該選擇後者(廢話...)。於是我就選擇了後者(你敢再說廢話嗎)。那麼就有了今天的這段筆記...

一開始我興致勃勃的拼好字串什麼的,寫了如下乙個觸發器

delimiter //

create trigger tri_user after insert on user for each row

begin

set @u_name = new.u_name;

set @expire = '';

select sm_pwd_alter_day into @expire from system_manage where sm_id = 1;

set @str = concat('create event eve_', @u_name, ' on schedule every ', @expire, ' day do

update user set u_enable = /'未啟用/' where u_name = /'', @u_name, '/'');

prepare stmt_str from @str;

execute stmt_str;

deallocate prepare stmt_str;

end;

//delimiter ;

「dynamic sql is not allowed in stored function or trigger」

my god,原來mysql的觸發器不支援動態sql,於是上網baidu尋找替代方法,無果,

然後google,方法出現:有人也遇到了觸發器裡執行動態sql的問題,然後發帖,後面高手解答說

把動態sql語句傳入儲存過程裡,然後在觸發器裡呼叫儲存過程就可以了。然後那位樓主還給了高手

70分(悲劇,後面說)...我想這次到位了。於是模仿之、於是執行之、於是出現結果:

「dynamic sql is not allowed in stored function or trigger」

臥槽...還是這個結果...

於是我明白了結了貼的也不一定是正確答案。

那麼我以為儲存過程裡執行動態sql,然後觸發器再呼叫這個儲存過程,還是相當於在觸發器裡執行動態sql。

不想再去深究了,還是老老實實在應用程解決這個問題了。

關於Mysql 觸發器

首先,測試版本 mysql 5.6。然後再看觸發器的語法 create definer triggertrigger name trigger timetrigger event ontbl namefor each row trigger body trigger time trigger eve...

觸發器 mysql觸發器

觸發器是一種特殊的儲存過程,它在插入 刪除或修改特定表中的資料時觸發執行,它比資料庫本身標準的功能有更精細和更複雜的資料控制能力。和儲存過程一樣,很少使用。1 觸發器的作用 2 建立觸發器 建立測試環境 mysql create database test db query ok,1 row aff...

MySQL中觸發器

觸發器是與某個事件相關的特殊儲存過程,與儲存過程不同的是,儲存過程需要用 call 呼叫而出發器不需要使用call呼叫呼叫。也就是自己預先定義好了,當某個事件發生時,就會自動出發觸發器進行相關的操作。僅對 insert update delete 有效,對select無。trigger name 觸...