Mysql

在觸發器中更新查詢

  • January 22, 2022

我有一個配置表:

桌子:refdatecol

id           int(11)
startdatecol varchar(100)
enddatecol   varchar(100)
datecolTable varchar(100)

此表包含使用者配置的列名和表名。我正在使用來自另一個表的數據refdatecol並更新另一個表來建構查詢執行時project_wbs。我正在使用動態 SQL。這在過程中執行良好。

問題是:我想將目前日期值提取到project_wbson 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,它向您展示瞭如何構造觸發器(假設除了在任何/每次更新/插入上設置目前時間之外沒有其他邏輯)。

引用自:https://dba.stackexchange.com/questions/73513