2012-12-11 110 views
1

我有一個消息表。在消息插入之後,我需要將該插入的UserID和MsgID插入到messageRecipient表中。如果郵件已發送給組,則需要將其插入到屬於該組成員的每個用戶。這裏是我的,但它沒有插入到messageRecipient表中:插入後的Oracle觸發器

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; 
/

究竟是什麼問題呢?

+0

你被分配增加不必要的複雜性:新值的變量。我會開始刪除它們。實際上,如果是我,我實際上首先要刪除觸發器,並將消息表中的插入和插入收件人表中的插入一起執行,因爲觸發器對於使應用程序難以使用而臭名昭着。 –

回答

3

與PL/SQL中的null比較將評估爲null。條件語句僅在true上執行。 檢查here作爲參考。

userID1 <> null更改爲userID1 is not nullgroupID1 <> nullgroupID1 is not null

此外,您不需要添加if inserting,因爲此觸發器僅用於插入語句。

0

也許你正在檢查來自另一個會話的messageRecipient表。 請記住,觸發器是插入到消息表中的事務的一部分,因此在提交出現之前不會看到任何更改。

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; 
0

我建議你需要回答的問題 「我如何找出什麼錯誤在這裏」

如果你的邏輯之前增加一個鑲件...

 INSERT INTO messageRecipient VALUES(msgID1, userID1); 

    if inserting then..... 

這會告訴你觸發器正在觸發,它正在觸發你的新值

所以它必須是不工作的比較邏輯..

如果你有一個catch你可以拋出一個錯誤的所有條件,這也將讓你清楚地看到問題的所在

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;