我有一个配置表:
表:refdatecol
id int(11)
startdatecol varchar(100)
enddatecol varchar(100)
datecolTable varchar(100)此表保存用户配置的列名和表名。我正在使用来自refdatecol的数据构建一个查询运行时,并更新另一个表project_wbs。我使用的是动态SQL。这在程序中很好。
问题是:我希望在insert或update上将当前日期值提取到project_wbs中。很自然,我想用扳机。但是触发器不支持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;发布于 2014-08-08 16:49:09
也许您可以使用一些用户定义的变量。我曾经对此写过一个答案:仅禁用一个表的触发器。我建议设置一个用户定义的变量来禁用触发器。
在这种情况下,如果只是更改SQL语句的参数值,则不需要动态SQL。如果要更改查询的表名和列名,则必须构造一些好的IF...THEN触发器中的块,如我的帖子所演示的。。如果有太多的表或太多的列名来创建IF...THEN块,那么就坚持使用存储过程方法。
发布于 2018-10-18 05:39:28
使用动态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
复制相似问题