【问题标题】:Oracle Trigger After Insert插入后的 Oracle 触发器
【发布时间】:2012-12-11 08:24:00
【问题描述】:

我有一个消息表。在插入消息后,我需要将该插入的 UserID 和 MsgID 插入到 messageRecipient 表中。如果消息被发送到组,则需要将其插入到属于该组的每个用户。这是我所拥有的,但它没有插入到 messageRecipient 表中:

create or replace trigger update_messages
after insert on messages referencing new as new old as old  
for each row
declare 
      userID1 int(10);
      msgID1 int(10);
      groupID1 int(10);
begin
      userID1 := :new.ToUserID;
      msgID1 := :new.msgID;
      groupID1 := :new.ToGroupID;

     if inserting then
            if(userID1 <> null)
                then INSERT INTO messageRecipient VALUES(msgID1, userID1);
            elsif(groupID1 <> null)
                THEN INSERT INTO messageRecipient(msgID, userID) SELECT msgID1, userID FROM groupMembership WHERE gID = groupID1;
            end if;
     end if; 
end;
/

这里到底出了什么问题?

【问题讨论】:

  • 您通过将 :new 值分配给变量来增加不必要的复杂性。我会先删除它们。实际上,如果是我,我实际上会从删除触发器开始,并使用单个过程实现向消息表中的插入和向收件人表中的插入,因为触发器因使应用程序难以使用而臭名昭著。跨度>

标签: database oracle triggers


【解决方案1】:
create or replace trigger update_messages
-- after insert on messages referencing new as new old as old  
-- for each row

declare 
    userID1 int(10);
    msgID1 int(10);
    groupID1 int(10);
begin
    userID1 := :new.ToUserID;
    msgID1 := :new.msgID;
    groupID1 := :new.ToGroupID;

     if(userID1 is not null)
            then INSERT INTO messageRecipient VALUES(msgID1, userID1);
        elsif(groupID1 is not null)
            THEN INSERT INTO messageRecipient(msgID, userID) SELECT msgID1, userID FROM groupMembership WHERE gID = groupID1;
        end if;
 end;

【讨论】:

    【解决方案2】:

    与 PL/SQL 中的 null 相比,计算结果为 null。条件语句仅在true 上执行。 检查here 以获得一些参考。

    userID1 &lt;&gt; null 更改为userID1 is not null,将groupID1 &lt;&gt; null 更改为groupID1 is not null

    另外,您不需要添加if inserting,因为此触发器仅用于插入语句。

    【讨论】:

      【解决方案3】:

      也许您正在检查来自另一个会话的 messageRecipient 表。 请记住,触发器是插入消息表的事务的一部分,因此在提交到来之前不会看到任何更改。

      【讨论】:

        【解决方案4】:

        我建议你需要回答这个问题 '我如何找出这里出了什么问题'

        如果您在逻辑之前添加插入...

             INSERT INTO messageRecipient VALUES(msgID1, userID1);
        
             if inserting then.....
        

        这会告诉您触发器正在触发并且它正在获取您的新值

        所以一定是比较逻辑不工作..

        如果你有一个 catch all 条件,你可能会引发一个错误,这也可以让你准确地看到问题出在哪里

        if(userID1 is not null) then 
            INSERT INTO messageRecipient VALUES(msgID1, userID1);
        elsif(groupID1 is not null) THEN 
            INSERT INTO messageRecipient(msgID, userID) 
                SELECT msgID1, userID FROM groupMembership WHERE gID = groupID1;
        else
            RAISE ERROR HERE
         end if;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-30
          • 2015-08-20
          • 1970-01-01
          • 2015-06-11
          • 2017-06-26
          • 2011-12-06
          • 2018-04-11
          相关资源
          最近更新 更多