0

我正在尝试实现一个简单的通知系统,该系统将“通知”行插入到每个参与线程的用户的“通知”表中。我的代码发生在触发器中,目前用于通知用户另一个用户已经回复了他的特定评论,但没有通知线程中的其他人已经发布了新评论。

ALTER TRIGGER OnDocumentCommentPosted
ON DocumentComments
AFTER
INSERT 
AS
IF (SELECT InResponseTo FROM inserted) IS NOT NULL
BEGIN
INSERT INTO Notifications
([CommentID],[Type],[RecieverId]) //This is a notification object from table Notifications shown at the bottom of this post
SELECT id, 'DocumentComment', InResponseTo //this is a DocumentComment object from table DocumentComments shown at the bottom of this post
FROM inserted
END

我基本上想从下面的查询中获取结果,然后为每个结果运行上面的相同查询。

SELECT OwnerId FROM DocumentComments WHERE DocumentID = @DocumentId

给我一个ID列表

然后对于列表中的每个 id 运行以下查询,将每个 id 替换为 @id

SET @Comid = (SELECT id FROM inserted);

INSERT INTO Notifications
([CommentID],[Type],[RecieverId])
@Comid, 'DocumentComment', @id

有没有办法将这种类型的功能加入到我上面的原始触发器查询中?

编辑

似乎这可能有点难以理解,所以让我试着简单地解释一下我的表结构

简要说明

表:文档 - (保存 excel、pdf 的实际数据,以及通过用户上传的任何内容)

表:DocumentComments -(保存对每个文档的评论 [One - Many])

表:通知 - (保存每条评论的通知数据,并提供布尔值是否已被阅读

底层结构

表文档
PK = id

表 DocumentComments
PK = id
FK = DocumentId
InResponseTo = 已通过插入评论回复评论的用户的 UserId OwnerId = 拥有或创建此评论的用户的 UserId

表通知(与 DocumentComments 没有直接关系,因为该表是一个通用表,其中包含许多类型的通知,而不仅仅是 DocumentComment 通知

PK = id
FK = RecieverId = 将接收此通知的用户的 UserId。
CommentID = 如果通知处理评论,则此值将填充有问题的评论

AnnouncementID = 如果通知涉及公告,则此值将填充有问题的公告

EventID
MeetingID = 这两个字段的工作方式与上述两个字段相同。

Read = boolean,通知的读取状态

4

1 回答 1

0

在这里,试试这个:

SET @Comid = (SELECT id FROM inserted);

INSERT INTO Notifications
([CommentID],[Type],[RecieverId])
SELECT @Comid, 'DocumentComment',OwnerId FROM DocumentComments WHERE DocumentID = @DocumentId
于 2013-05-09T08:02:26.607 回答