aktualisieren Sie eine Tabelle mit Trigger nach löschen und aktualisieren

In meiner Website zeige ich eine list von Namen und deren Kommentar zählen. Ich habe es so gemacht:

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

Jetzt möchte ich eine comment_count Spalte zu meiner Namens-Tabelle hinzufügen und weglassen abzählen zählen. da jeder Kommentar bestätigt werden muss und mein Bestätigungsbefehl entweder den Kommentar löscht (falls er nicht geeignet ist) oder seine bestätigte Fahne auf 1 aktualisiert, versuche ich dies zu tun:

 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 

aber ich bekomme einen Fehler:

Die mehrteilige Kennung "d.nid" konnte nicht gebunden werden.

Zunächst einmal gibt es keine updated Pseudo-Tabelle in SQL server; Im Falle eines UPDATE Vorgangs wird deleted die alten Werte, während Inserted die neuen enthält.

Zweitens: In beiden Fällen sind Sie nicht auf deleted AS d in Ihrer UPDATE statement irgendwo – so natürlich können Sie nicht auf d.nid – es gibt keinen Alias d in diesem Bereich

Da sowohl in der DELETE als auch im UPDATE Fall du Einträge in der Deleted dbo.Names hast, das ist alles, was du brauchst – alle betroffenen Zeilen in der dbo.Names Tabelle müssen aktualisiert werden.

Versuche so etwas wie:

 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 

Also mache ich gerade einen INNER JOIN zwischen den dbo.Names und den Deleted Tabellen, die mir alle Zeilen in dbo.Names , die entweder aktualisiert oder gelöscht wurden.

Die COUNT(id) kann auch vereinfacht werden, indem ein INNER JOIN zwischen der Tabelle dbo.Comments und der Deleted dbo.Comments .