我遇到了MSSQL触发器的问题。我想创建触发器,检查其他表中是否存在id,如果存在,则不会插入记录。
实施例 我们有人,人可以是学生或教师,但它不能同时是学生和教师。因此,我需要在插入和更新之前进行检查,如果教师存在与我尝试插入的学生相同的ID。我不确定这是否清楚?
我试图找到答案,我找到了一些触发器但不是我想要的。你能帮我解决这个问题吗?
我用我的问题附上UML图: UML Diagram
在穆罕默德·阿里的帮助下,我写了这个:
CREATE Trigger tr_TriggerName
ON Student
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
IF NOT EXISTS
(SELECT Teacher.id
FROM Teacher
WHERE Teacher.id =
(SELECT inserted.id FROM inserted))
BEGIN
/* This isnert is wrong I don't know how to write it?????*/
INSERT INTO Student VALUES (inserted.id, inserted.field1, inserted.field2);
END
ELSE
RAISERROR ('There is already a Teacher with the same Student id', 0, 0);
RETURN
END
这正是我想要的,但我不知道如何写这个插页。
我之前写过,Person可以是学生或教师,但同时也不能是学生和教师。因此,如果我想将Student插入我的桌子,我必须检查桌子上的Teatchers。如果Teacher存在相同的Persson id(就像我尝试插入的Student那样),我必须显示错误消息。如果(或者.. :))教师不存在我需要插入他,但我不知道怎么在我的触发器中写这个插入。
答案 0 :(得分:1)
尝试这个替代方案:
CREATE Trigger tr_TriggerName
ON Student
INSTEAD OF INSERT
AS
BEGIN
declare @count int
select @count=count(*) from inserted
insert into Student (id,field1,field2)
select id,field1,field2 from inserted
where id not in (select id from teacher)
if @@ROWCOUNT<@count
raiserror('Some Teachers were rejected due to conflicts with Student ids', 0, 0);
END
编辑:我对它进行了一些修改,以便错误消息覆盖多行插入的部分失败。为了显示每个被拒绝的id
的错误,应该使用游标。
答案 1 :(得分:0)
我这样做了,没有重写INSERT逻辑,所以可以在INSERT和UPDATE上使用相同的触发器。
CREATE TRIGGER tr_StudentNotTeacher
ON Student
AFTER INSERT, UPDATE
AS
IF EXISTS ( SELECT * FROM Teacher T
JOIN inserted i ON i.id=T.id
WHERE T.id IS NOT NULL )
BEGIN
RAISERROR('Person cannot be Student and Teacher at the same time', 16, 1);
ROLLBACK TRANSACTION;
RETURN
END;
在教师表上需要相同(类似)的触发器。