DB2 触发器哪个更新

Posted

技术标签:

【中文标题】DB2 触发器哪个更新【英文标题】:DB2 trigger which update 【发布时间】:2016-08-05 12:27:01 【问题描述】:

我正在尝试使用触发器更新另一个表。这是我的代码:

   CREATE TRIGGER REORDER
         AFTER UPDATE OF ON_HAND
         REFERENCING NEW AS N
         FOR EACH ROW
         WHEN (N.ON_HAND < 0.1)
         BEGIN ATOMIC
         UPDATE SRI set SRI.price = SRI.price*10 where SRI.CODE = N.CODE;
    END

我收到以下错误:

在“CODE = N.CODE"。预期的标记可能包括:"".. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.68.61

【问题讨论】:

在“CODE = N.CODE”之后发现了一个意外的标记“END-OF-STATEMENT”。预期的标记可能包括:“”.. SQLCODE=-104, SQLSTATE=42601, DRIVER=3.68.61 你能有// cmets 吗?另外,也许你在更新之后需要; 注释不在代码中,我添加了;错误与此分隔符有关 对我 8 月 5 日 answer 的评论将显示 [与 OP 使用的不同的解析器] 如何诊断 8 月 5 日更新的触发源,给出的可能是更清晰的图片问题出在哪里;即错误将在更接近 REFERENCING 子句而不是在 END-OF-STATEMENT 附近被发现。我认为我的简短回答同样清楚,但显然反对投票是其中一些人的一项运动,测试所提供的内容是一种诅咒;根据看到的反馈,我更长的答案迭代地显示了实际看到的效果,作为实际自己执行测试的证明 【参考方案1】:

以下脚本请求显示了一个设置,然后是两个失败的请求和一个成功的请求;第一个 CREATE TRIGGER 与 OP 中的 [触发器的格式和命名除外] 基本相同,其余两个是其小修改的结果:

设置:

create table on_hand_table (code char, on_hand dec(3, 1) )
; -- Table ON_HAND_TABLE created
create table sri (code char, price dec(7, 2) )
; -- Table SRI created

几个 CREATE TRIGGER 请求;完整的触发器名称用于解释从先前迭代中建立的有效模块,每个请求后面的注释描述了运行 IBM DB2 for i 7.1 的结果:

 create trigger ReOrder_source_unchanged               
 after update of ON_HAND                               
 referencing NEW as N                                  
 for each row                                          
 when (N.ON_HAND < 0.1 )                               
 begin ATOMIC                                          
    UPDATE SRI                                         
      set SRI.price = SRI.price*10                     
    WHERE SRI.code  = N.code                           
    ;                                                  
 end                                                   
 -- Keyword REFERENCING not expected. Valid tokens: ON OR.

 create trigger ReOrder_OF_Changed_to_ON
 after update on ON_HAND              
 referencing NEW as N                 
 for each row                         
 when (N.ON_HAND < 0.1 )              
 begin ATOMIC                         
    UPDATE SRI                        
      set SRI.price = SRI.price*10    
    WHERE SRI.code  = N.code          
    ;                                 
 end                                  
 -- Table ON_HAND not found.

 create trigger ReOrder_both_OF_and_ON
 after update of ON_HAND              
              on ON_HAND_TABLE        
 referencing NEW as N                 
 for each row                         
 when (N.ON_HAND < 0.1 )              
 begin ATOMIC                         
    UPDATE SRI                        
      set SRI.price = SRI.price*10    
    WHERE SRI.code  = N.code          
    ;                                 
 end                                  
 -- Trigger REORDER_BOTH_OF_AND_ON created

【讨论】:

【参考方案2】:

在 OP 中给出的 CREATE TRIGGER 中似乎缺少 ON table-reference;只有OF column-name 被编码。这可能是问题的根源,尽管该语法问题被诊断为一个奇怪的位置。?

 create trigger ReOrder 
 after update of ON_HAND /* this names the column being updated */
              on ON_HAND_TABLE /* this is missing from OP */
 referencing NEW as N   
 …

【讨论】:

很好,但我认为它仍然需要一个时间。 我无法告诉任何人该怎么想,但我展示的 [作为唯一的变化] 为我创造了一个很好的触发器。手册中的语法甚至显示了WHEN--(--search-condition--)-,这正是 OP 编码的内容;这大概就是我能够使用原始源代码创建 DB2 TRIGGER 的原因,只需进行我建议的微小更改。

以上是关于DB2 触发器哪个更新的主要内容,如果未能解决你的问题,请参考以下文章

DB2 更新触发器

更新错误后的 DB2 触发器

DB2 SQL 代替更新触发器

如何防止 DB2 中的递归触发器调用

db2中的SP是不是等待触发器执行

如何将 DB2 触发器转换为 SQL Server?