插入后的Oracle触发器

时间:2012-12-11 08:24:01

标签: database oracle triggers

我有一个消息表。在消息上插入后,我需要将该插入的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;
/

这到底出了什么问题?

4 个答案:

答案 0 :(得分:4)

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;

答案 1 :(得分:3)

与PL / SQL中的null相比,评估为null。条件语句仅在true上执行。 查看here以获取参考信息。

userID1 <> null更改为userID1 is not null,将groupID1 <> null更改为groupID1 is not null

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我建议你需要回答这个问题 “我如何弄清楚这里出了什么问题”

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

     INSERT INTO messageRecipient VALUES(msgID1, userID1);

     if inserting then.....

这会告诉你触发器正在触发,它正在拾取你的新值

所以它必须是不起作用的比较逻辑..

如果你有一个捕获所有条件,你可能会引发错误,这也可以让你看到问题的确切位置

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;