Sql server 而不是插入触发器SQL

Sql server 而不是插入触发器SQL,sql-server,tsql,Sql Server,Tsql,我正在尝试创建一个“而不是插入触发器”,它不会让名称“john”在表中插入任何内容。我的问题是,即使我将名称更改为其他名称,查询也会成功,但没有添加值 任何帮助都将不胜感激,提前谢谢 CREATE TRIGGER InsteadOfTrigger ON Question4 INSTEAD OF INSERT AS Declare @name varchar(50) Declare @question varchar(50) Declare @Answer char Set @name = '

我正在尝试创建一个“而不是插入触发器”,它不会让名称“john”在表中插入任何内容。我的问题是,即使我将名称更改为其他名称,查询也会成功,但没有添加值

任何帮助都将不胜感激,提前谢谢

CREATE TRIGGER InsteadOfTrigger
ON Question4
INSTEAD OF INSERT
AS  
Declare @name varchar(50)
Declare @question varchar(50)
Declare @Answer char
Set @name = 'John'
IF (select Username from inserted) = @name
BEGIN
RAISERROR ('You have not paid up your fee', 10,1)
ROLLBACK TRANSACTION
END
ELSE
BEGIN
INSERT INTO question4
values (@name, @question, @Answer)
END
我已经删除了IF-ELSE语句之间的BEGIN和END语句,并将触发器逻辑包装在BEGIN-END中

正如下面评论中提到的,您不需要回滚事务

此外,您还需要填充@question和@Answer以使其具有任何用途

CREATE TRIGGER InsteadOfTrigger
ON Question4
INSTEAD OF INSERT
AS 
BEGIN

Declare @name varchar(50)
Declare @question varchar(50)
Declare @Answer char

Set @name = 'John'

IF (select Username from inserted) = @name
    RAISERROR ('You have not paid up your fee', 10,1)
    --ROLLBACK TRANSACTION
ELSE
    INSERT INTO question4
    values (@name, @question, @Answer)

END

嗯,我注意到您已经声明了,但实际上并没有在else语句中为变量设置一个值,这可能导致SQL无法插入您所期望的内容。 奇怪的是,我现在在一项作业中也被要求这样做,以下是我的解决方案:

CREATE TRIGGER instead_of_insert
ON Question4

INSTEAD OF INSERT AS

Declare @Username varchar(25) 
Declare @Question varchar(6)
Declare @Answer char(1)

Set @Username ='John'

IF (Select UserName from inserted) = @UserName
Begin
RAISERROR ('You have not paid up your fee', 10,1)
End

Else
Begin

Set @Username = (Select UserName from inserted)
Set @Question = (Select Question_ID from inserted)
Set @Answer = (Select Answer from inserted)

Insert into User_Responses 
Values
(@username, @Question, @Answer) 

End

我的猜测是SQL与BEGIN和END语句混淆了。你说查询成功了。我猜你的意思是它不会出错。尝试在IF语句的两边都出现一个错误,看看它是否抛出。您的根本缺陷是您似乎认为触发器每行调用一次。事实并非如此-每个语句调用一次,如果INSERT语句插入多行,则插入的伪表将包含多行-在这种情况下-使用select Username from Inserted语句选择多行中的哪一行??您需要重写触发器以将插入的多行考虑在内!不需要回滚事务如果您确定和/或解释您所做的更改,这些答案会更好。@bendataclear我在对问题的评论中提到了我认为问题是什么。