删除和更新后使用触发器更新表

时间:2013-12-29 09:53:11

标签: sql-server triggers

在我的网站上,我会显示一个名单及其评论数量列表。我这样做:

select * 
from names, (select count(id) from comments where nid = names.id) comment_count

现在我想在我的名字表中添加一个comment_count列,并省略检索计数。因为每个评论都需要确认,并且我的确认命令要么删除评论(如果不合适),要么将其确认的标志更新为1,我正在尝试这样做:

create trigger change_comment_count 
on comments after update,delete
as 
   if exists(select id from deleted)
      update names 
      set comment_count = (select count(id) 
                           from comments 
                           where nid in (select nid from deleted d) 
                             and confirmed = 1) 
      where id = d.nid
else
    if exists(select id from updated)
       update names 
       set comment_count = (select count(id) 
                            from comments 
                            where nid in (select nid from deleted d) 
                              and confirmed = 1) 
       where id = d.nid

但是我收到了一个错误:

  

无法绑定多部分标识符“d.nid”。

1 个答案:

答案 0 :(得分:1)

首先 - SQL Server中没有updated伪表;对于UPDATE操作,deleted将包含旧值,而Inserted将包含新值。

其次:在这两种情况下,您都 deleted AS d语句中引用UPDATE - 当然,您无法引用d.nid - 那里该范围内没有别名d

由于在DELETEUPDATE两种情况下,您将在Deleted伪表中有条目,这就是您需要查看的所有条目 - {中的所有受影响的行{1}}表需要更新。

尝试这样的事情:

dbo.Names

所以我只是在CREATE TRIGGER change_comment_count ON dbo.Comments AFTER UPDATE,DELETE AS UPDATE dbo.Names SET comment_count = (SELECT COUNT(c.id) FROM dbo.Comments c INNER JOIN Deleted d ON c.nid = d.nid WHERE c.confirmed = 1) FROM deleted d WHERE dbo.Names.id = d.nid INNER JOIN表之间执行了dbo.Names,它为我提供了Deleted中所有已更新或删除的行。

dbo.Names也可以通过在COUNT(id)表和INNER JOIN伪表之间使用dbo.Comments来简化。