2014-11-13 2 views
2

Вот код. Это триггер, который выполняется после вставкиКак я могу остановить выполнение триггера изнутри самого себя?

ALTER TRIGGER [dbo].[GameStacker] 
ON [dbo].[CDKeyUser] 
AFTER INSERT AS 
BEGIN 
    INSERT INTO User_Achivement 
      (User_ID , 
      Achivement_ID, 
      Date 
      ) 
    VALUES ((SELECT User_ID from inserted), 
      (SELECT 
       CASE 
        WHEN COUNT(cd.User_ID)=1 THEN 1 
        WHEN COUNT(cd.User_ID)=5 THEN 2 
        WHEN COUNT(cd.User_ID)=10 THEN 3 
        WHEN COUNT(cd.User_ID)=15 THEN 4 
       END 
      FROM CDKeyUser cd 
      WHERE cd.User_ID=(SELECT User_ID from inserted) 
      ),     
      GETDATE() 
      ) 
END 

Так что моя проблема заключается в том, что этот триггер выполняется после каждой вставки. (Я знаю, что то, как это должно работать.) Но, если КОГДА COUNT (кд. User_ID) имеет значение, отличное от указанных здесь значений, оно не должно выполняться или просто прерывать выполнение. Если я добавлю инструкцию else после WHEN COUNT(cd.User_ID)=15 THEN 4, я не могу включить туда какой-либо код, например, raiseerror, потому что он переведен в значение Achivement_ID, и это дает мне ошибку. Так что в основном я должен разорвать выполнение инструкции insert.

Я был бы очень признателен, если кто-то может помочь мне с этим

+0

Это только начинается с альтер, потому что она была создана, и я был только его модификации. –

ответ

0

Try:

if (select count(cd1.User_ID) 
    FROM CDKeyUser cd1 
    WHERE cd1.User_ID=(SELECT User_ID from inserted)) IN (1, 5, 10, 15) 
begin 
    --your insert statement 
end 

Полный код:

ALTER TRIGGER [dbo].[GameStacker] 
ON [dbo].[CDKeyUser] 
AFTER INSERT AS 
BEGIN 
if (select count(cd1.User_ID) 
    FROM CDKeyUser cd1 
    WHERE cd1.User_ID=(SELECT User_ID from inserted)) IN (1, 5, 10, 15) 
begin 
    INSERT INTO User_Achivement 
      (User_ID , 
      Achivement_ID, 
      Date 
      ) 
    VALUES ((SELECT User_ID from inserted), 
      (SELECT 
       CASE 
        WHEN COUNT(cd.User_ID)=1 THEN 1 
        WHEN COUNT(cd.User_ID)=5 THEN 2 
        WHEN COUNT(cd.User_ID)=10 THEN 3 
        WHEN COUNT(cd.User_ID)=15 THEN 4 
       END 
      FROM CDKeyUser cd 
      WHERE cd.User_ID=(SELECT User_ID from inserted) 
      ),     
      GETDATE() 
      ) 
    end 
    END 
+0

Но работает ли инструкция if? Я имею в виду, это синтаксически правильно? –

+0

@ SzilárdJakab Должен работать. – artm

+0

@ SzilárdJakab Я добавил полный код. – artm

1

попробовать что-то вроде этого.

IF EXISTS (SELECT Count(A.User_ID) cnt 
      FROM CDKeyUser A 
        JOIN inserted B 
        ON a.User_ID = b.User_ID 
      HAVING Count(A.User_ID) IN (1, 5, 10, 15)) 
    BEGIN 
     INSERT INTO User_Achivement 
        (User_ID,Achivement_ID,Date) 
     VALUES  ((SELECT User_ID 
        FROM inserted),(SELECT CASE 
               WHEN Count(cd.User_ID) = 1 THEN 1 
               WHEN Count(cd.User_ID) = 5 THEN 2 
               WHEN Count(cd.User_ID) = 10 THEN 3 
               WHEN Count(cd.User_ID) = 15 THEN 4 
              END 
             FROM CDKeyUser cd 
             WHERE cd.User_ID = (SELECT User_ID 
                  FROM inserted)),Getdate()) 
    END 
0
ALTER TRIGGER [dbo].[GameStacker] 
ON [dbo].[CDKeyUser] 
AFTER INSERT AS 
BEGIN 
if (selet COUNT(User_ID) from CDKeyUser)<=15 
begin 
'your code' 
END 
end 
Смежные вопросы