在觸發器中更新查詢
我有一個配置表:
桌子:
refdatecol
id int(11) startdatecol varchar(100) enddatecol varchar(100) datecolTable varchar(100)
此表包含使用者配置的列名和表名。我正在使用來自另一個表的數據
refdatecol
並更新另一個表來建構查詢執行時project_wbs
。我正在使用動態 SQL。這在過程中執行良好。問題是:我想將目前日期值提取到
project_wbs
on insert OR update中。自然,我想到了使用觸發器。但是觸發器不支持 MySQL 中的動態 SQL。所以我想到了從觸發器呼叫過程。然後我了解到這是嚴格禁止的。
有什麼辦法可以做到這一點?
我也願意考慮完全重新設計這個使用者可配置的日期
更新
這是儲存過程:
create procedure sp_project_date (_id int) begin set @_startdate =''; set @_enddate =''; set @_projectId = (select project_wbs.proj_projectId from project_wbs project_wbs where id = _id); set @q = (select concat('select ', startdatecol, ' , ', enddatecol , ' into @_startdate, @_enddate from ' , datecolTable , ' where project_ProjectId = ' , @_projectId) as 'query' from refdatecol where id = (select p.cogsDateId from project p where p.projectId = @_projectId) ); prepare stmt from @q; execute stmt; UPDATE project_wbs SET project_startdate = @_startdate, project_enddate = @_enddate WHERE id = _id; DEALLOCATE PREPARE stmt;
也許您可以使用一些使用者定義的變數。我曾經寫過一個答案:只為一張表禁用觸發器。我建議設置一個使用者定義的變數來禁用觸發器。
在您的情況下,如果您只是更改 SQL 語句的參數值,則不需要動態 SQL。如果要更改查詢的表名和列名,則必須像我的文章展示的那樣在觸發器中構造一些好的
IF...THEN
塊。如果有太多的表或太多的列名來製作IF...THEN
塊,那麼堅持使用儲存過程方法。
使用您的動態 SQL 和/或儲存過程將您的記錄插入
project_wbs
.
project_wbs
on update
向和/或添加一個或多個觸發器on insert
。在觸發器中,將project_wbs.Current_Date_Column_Name
值設置為now()
。就這些。
您的動態 SQL / 儲存過程負責更新業務數據,而您的觸發器僅負責更新該表中的“目前日期/時間”列 - 任何時候插入/更新記錄(無論滿足您的要求)。
注意 - 當任何SQL 更新您的數據時,這將更新該列
project_wbs
。這可以接受嗎?在另一個關於堆棧交換的問題中有一些簡單的 SQL,它向您展示瞭如何構造觸發器(假設除了在任何/每次更新/插入上設置目前時間之外沒有其他邏輯)。