2014-09-04 3 views
1

У меня есть триггер на моей базе данных, которая предотвращает конкретный пользователь от ввода и останавливает пользователь от входа тот же вопроса дважды:Вместо вставки триггера не выполняется, если оператор corectly

create trigger [dbo].[question] 
on [dbo].[Online_Questions] 
instead of insert 
as 
if SYSTEM_USER = 'John' 
begin 
raiserror('You have not paid up your fee',16,1) 
rollback transaction 
end 
if exists(select 1 
    from Online_Questions a, inserted b where a.UserName = b.UserName 
    and a.Question_ID = b.Question_ID) 
begin 
raiserror('You have already submitted this question',16,1) 
rollback 
end 
go 

Он успешно предотвращает Джон от входа , но он не позволяет любому войти дважды, независимо от Question_ID.

Например:

execute as login = 'Tom'; 

insert into Online_Questions (UserName, Question_ID, Answer) 
values (user, 'Q097', 'D'); 

, а затем

insert into Online_Questions (UserName, Question_ID, Answer) 
values (user, 'Q087', 'D'); 

возвратит ошибку как триггер предотвратило вставку.

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

Любые предложения?

+0

попытайтесь изменить этот триггер для триггера после запуска, у меня есть проблема, подобная этому несколько недель назад, но я не могу вспомнить, что это была проблема. Поскольку вы используете откат внутри статута, это не будет проблемой после триггера. – FpontoDesenv

+0

@FpontoDesenv Мне нужно использовать триггер insert (это требование), поэтому, к сожалению, я не могу попробовать после запуска. – James

+0

@AaronBertrand. Я думал, что уже смотрел на это, когда я сопоставлял значения, вставленные в те, стол? – James

ответ

0

Я выяснил, где я ошибся, он не совсем правильно отформатирован и смотрит на обе таблицы. Вот решение.

create trigger [dbo].[question] 
on [dbo].[Online_Questions] 
instead of insert 
as 
if SYSTEM_USER = 'John' 
begin 
raiserror('You have not paid up your fee',16,1) 
return 
end 
if (not exists (select oq.UserName, oq.Question_ID from Online_Questions oq, inserted i where oq.UserName = i.UserName and oq.Question_ID = i.Question_ID)) 
begin 
insert into Online_Questions 
select User, Question_ID, Answer 
from inserted 
end 
else 
begin 
raiserror('You have already submitted this question',16,1) 
end 
go