我有一个消息表。在消息上插入后,我需要将该插入的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;
/
这到底出了什么问题?
答案 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;