有必要在任何领域添加一条独特的线。 我写这个:
alter trigger Triger1
on Week_Schedule for insert
as
if @@ROWCOUNT=1
begin
if exists (
select *
from inserted as i, Week_Schedule as w
where i.Week_Number = w.Week_Number
)
begin
rollback tran
print 'Week number already exists!'
end
end
但出了点问题。通过添加一个独特的行,会弹出一个带有触发器文本的警告。我该如何解决这个问题?
答案 0 :(得分:1)
无需检查@@ROWCOUNT
。您已使用inserted
正确编写了逻辑,因此您不需要像这样的一些奇怪的解决方法。
如果我理解正确,只需将触发器的主体封装在begin
/ end
块中:
alter trigger Triger1
on Week_Schedule for insert
as
begin
if exists (select 1
from inserted i join
Week_Schedule w
on i.Week_Number = w.Week_Number
)
begin
rollback tran
print 'Неделя с таким номером уже существует!'
end;
end;
然后,您可以在begin
/ end
块中添加其他语句。
编辑:
如评论中所述,上述内容将回滚所有插入内容(而不是原始问题中的单行内容)。
我强烈怀疑OPs问题的真正解决方案是外键,唯一和可能检查约束的某种组合。但是,这将是另一个问题的答案,我鼓励OP提出这个问题。
答案 1 :(得分:0)
正如评论中所提到的,您应该考虑一个独特的约束。触发器可能会导致许多意外后果,并且对于这种特殊情况来说是不必要的开销。
ALTER TABLE dbo.Week_Schedule
ADD CONSTRAINT YOURCONSTRAINTNAMEHERE UNIQUE (Week_number)