触发器SQL的替代方法

4
我正在尝试创建一个“代替插入触发器”,不会允许名称为“john”的任何人将任何内容插入表中。我的问题是,即使我将名称更改为其他内容,查询也会成功,但值不会被添加。
非常感谢您的帮助。请留意HTML标签。
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

我的猜测是SQL语句中的BEGINEND语句混淆了。 你说查询成功了,我猜你的意思是它没有抛出错误。 尝试在IF语句的两侧使用RAISERROR,看看是否会抛出错误。 - Squirrel5853
2
你的根本性缺陷在于你似乎认为触发器将会被调用每一行一次。事实并非如此——它是被调用每个语句一次,如果你的INSERT语句插入了多行,那么Inserted伪表将包含多行——在这种情况下,你使用(select Username from inserted)语句选择的是哪些多行?你需要重写你的触发器以考虑**Inserted中的多行**! - marc_s
2个回答

4

好的,所以我已经在你的IF ELSE语句之间删除了你的BEGINEND语句,并将触发器逻辑包装在一个BEGIN END中。

如下面的评论所述,您不需要ROLLBACK TRANSACTION

此外,您需要填充@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

不需要使用ROLLBACK TRANSACTION。 - Serjik
如果您能够标识和/或解释您所做的更改,那么这些答案会更好。 - bendataclear
@bendataclear,我在评论中提到了我认为问题所在。 - Squirrel5853

2

嗯,我注意到您已经声明了变量,但实际上在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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接