在这种情况下,我不知道如何使用。当得分> 10时,停止插入。否则继续照常插入。但是,这样做的语法是什么?
CREATE TRIGGER invalidScore ON dbo.dbo_score
AFTER INSERT
AS
DECLARE @score DECIMAL;
SET @score = (SELECT s.score FROM Inserted s);
IF(@score > 10)
BEGIN
RETURN 'score must be less than 10'
ROLLBACK TRAN
END
ELSE
BEGIN
END
答案 0 :(得分:1)
首先,创建这些类型的sql
对象应使用begin.. end
块。其次,您可以忽略else
语句。
CREATE TRIGGER invalidScore ON dbo.dbo_score
AFTER INSERT
AS
BEGIN
DECLARE @score DECIMAL;
SET @score = (SELECT s.score FROM Inserted s);
IF(@score > 10)
BEGIN
RETURN 'score must be less than 10'
ROLLBACK TRAN
END
END
答案 1 :(得分:1)
要使此触发器起作用,您需要更改3件事:
else
部分-其可选部分。Inserted
可能有多行的事实。Throw
错误,而不是使用return
语句,以便您可以在客户端中进行处理。并在回滚进行中的事务后将其丢弃。正确的触发器如下:
create trigger invalidScore on dbo.dbo_score
after insert
as
begin
if exists (select 1 from Inserted S where S.Score > 10) begin
rollback tran;
throw 51000, 'score must be less than 10', 1;
end
end
答案 2 :(得分:0)
“其他”是一个选项部分,您可以删除它并使用它,但我可能希望您考虑对这种情况使用检查约束,而不是在得分列上添加触发检查
例如 创建表dbo.dbo_score(
Score int CHECK (score < 10)
);
CHECK约束更快,更简单,更可移植,需要更少的代码并且更不容易出错