Ik ben behoorlijk newby in SQL server 2000 en heb de volgende situatie (een beetje ingekort):
Ik ben bezig om een forum te bouwen. In SQL server heb ik o.a. de volgende tabellen aangemaakt :
USERS
FORUMMAIN
FORUMSUB
FORUMPOST
Nou heb ik een trigger geschreven voor de tabel USERS. Als ik een record (user) uit de tabel USERS verwijder, dan moeten gerelateerde records (gerelateerde users) in de tabellen FORUMMAIN, FORUMSUB en FORUMPOST) mee verwijderd worden:
Goed, bovenstaande trigger werkt prima, en gerealateerde records worden netjes gedelete.
Maar ook in FORUMSUB (en FORUMPOST) heb ik triggers. Deze triggers moeten records updaten in andere tabellen, zoals de datum van de laatste post, bijvoorbeeld. Zo heb ik de volgende trigger gemaakt voor de tabel FORUMSUB:
Als ik bovenstaande trigger naast de trigger op de tabel USERS activeer, en vervolgens een user wil verwijderen die meerdere records heeft in forumsub, dan krijg ik de volgende foutmelding:
Subquery returned more than one value. This is not permitted when the subquery follows =, !=, <, <=, >, >= or when the subquery is used as an expression.
Als ik een record delete in de tabel users, dan zal de trigger op de tabel users ervoor zorgen dat gerelateerde records in de tabel forumsub mee verwijderd worden. Op dit moment activeerd natuurlijk ook de trigger op de tabel forumsub, en hier zal het probleem wel ergens zitten.
Wie weet wat er fout gaat en hoe ik het op zou kunnen lossen?
Ik ben bezig om een forum te bouwen. In SQL server heb ik o.a. de volgende tabellen aangemaakt :
USERS
FORUMMAIN
FORUMSUB
FORUMPOST
Nou heb ik een trigger geschreven voor de tabel USERS. Als ik een record (user) uit de tabel USERS verwijder, dan moeten gerelateerde records (gerelateerde users) in de tabellen FORUMMAIN, FORUMSUB en FORUMPOST) mee verwijderd worden:
code:
1
2
3
4
5
6
7
8
9
| CREATE TRIGGER [TRIGGER_USER_DELETE] ON dbo.USERS FOR DELETE AS DECLARE @delete SMALLINT SELECT @delete = (SELECT user_id FROM Deleted) DELETE FROM FORUMMAIN WHERE FORUMMAIN.forummain_starterid = @delete DELETE FROM FORUMSUB WHERE FORUMSUB.forumsub_starterid = @delete DELETE FROM FORUMPOST WHERE FORUMPOST.forumpost_userid = @delete |
Goed, bovenstaande trigger werkt prima, en gerealateerde records worden netjes gedelete.
Maar ook in FORUMSUB (en FORUMPOST) heb ik triggers. Deze triggers moeten records updaten in andere tabellen, zoals de datum van de laatste post, bijvoorbeeld. Zo heb ik de volgende trigger gemaakt voor de tabel FORUMSUB:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| CREATE TRIGGER [DELETE_UPDATEFORUMMAIN] ON dbo.FORUMSUB
AFTER DELETE
AS
DECLARE @delete SMALLINT
DECLARE @records SMALLINT
DECLARE @datum SMALLDATETIME
DECLARE @replies SMALLINT
SELECT @delete = (SELECT forumsub_mainid FROM deleted)
SELECT @records = (SELECT COUNT(*) FROM FORUMSUB WHERE FORUMSUB.forumsub_mainid = @delete)
SELECT @replies = (SELECT SUM(FORUMSUB.forumsub_replies) FROM FORUMSUB WHERE FORUMSUB.forumsub_mainid = @delete)
IF @replies <> 0
BEGIN
SELECT @datum = (SELECT MAX(FORUMSUB.forumsub_lastpost) FROM FORUMSUB WHERE FORUMSUB.forumsub_mainid = @delete)
END
ELSE
BEGIN
SET @datum = NULL
END
UPDATE FORUMMAIN SET FORUMMAIN.forummain_topics = @records, FORUMMAIN.forummain_posts = @replies, FORUMMAIN.forummain_lastpost = @datum WHERE FORUMMAIN.forummain_id = @delete |
Als ik bovenstaande trigger naast de trigger op de tabel USERS activeer, en vervolgens een user wil verwijderen die meerdere records heeft in forumsub, dan krijg ik de volgende foutmelding:
Subquery returned more than one value. This is not permitted when the subquery follows =, !=, <, <=, >, >= or when the subquery is used as an expression.
Als ik een record delete in de tabel users, dan zal de trigger op de tabel users ervoor zorgen dat gerelateerde records in de tabel forumsub mee verwijderd worden. Op dit moment activeerd natuurlijk ook de trigger op de tabel forumsub, en hier zal het probleem wel ergens zitten.
Wie weet wat er fout gaat en hoe ik het op zou kunnen lossen?