1

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

4 回答 4

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;
于 2012-12-11T09:23:18.180 回答
3

nullPL/SQL 中的比较将评估为null. 条件语句仅在true. 检查here以获得一些参考。

更改userID1 <> nulluserID1 is not null和。groupID1 <> null_groupID1 is not null

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

于 2012-12-11T08:35:00.007 回答
0

我建议您需要回答“我如何找出这里出了什么问题”的问题

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

     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;
于 2012-12-11T10:11:57.757 回答
0

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

于 2012-12-11T08:36:45.377 回答