Tą drugą sprawę załatwiłem poprzez If exists
ale ten trigger wyrzuca błąd:
Msg 16915, Level 16, State 1, Procedure ogranicznik, Line 8
A cursor with the name 'Inserted_Cursor' already exists.
The statement has been terminated.
tzn. trigger działa dla pierwszego insertu a pozniej nazwa inserted_cursor jest zajęta.
dopisałem local przy powoływaniu kursora tj.
CREATE TRIGGER
ON zam_tab
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @clientId;
DECLARE Inserted_Cursor CURSOR LOCAL FOR
SELECT zam_klient_id FROM Inserted;
OPEN Inserted_Cursor;
FETCH NEXT FROM Inserted_Cursor INTO @clientId;
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT COUNT(*) FROM zam_tab WHERE zam_klient_id = @clientID) >= 3
BEGIN
RAISERROR('Klient nie może złożyć większej liczby zamówień!', 16, 1);
ROLLBACK TRAN;
END
FETCH NEXT FROM Inserted_Cursor INTO @clientId;
END
END
wtedy nie było błędu o powtórzeniu nazwy ale o niezamknięciu czyli:
Msg 16905, Level 16, State 1, Procedure ogranicznik, Line 21
The cursor is already open.
więc dodałem procedure zamykającą po END i wtedy zapytanie wykonuje się w nieskończoność jakby sie zapętliło.
CREATE TRIGGER
ON zam_tab
FOR INSERT, UPDATE
AS
BEGIN
DECLARE @clientId;
DECLARE Inserted_Cursor CURSOR LOCAL FOR
SELECT zam_klient_id FROM Inserted;
OPEN Inserted_Cursor;
FETCH NEXT FROM Inserted_Cursor INTO @clientId;
WHILE @@FETCH_STATUS = 0
BEGIN
IF (SELECT COUNT(*) FROM zam_tab WHERE zam_klient_id = @clientID) >= 3
BEGIN
RAISERROR('Klient nie może złożyć większej liczby zamówień!', 16, 1);
ROLLBACK TRAN;
END
close Inserted_Cursor;
FETCH NEXT FROM Inserted_Cursor INTO @clientId;
END
close Inserted_Cursor;
END
close Inserted_Cursor;