如果id存在,MSSQL触发器

时间:2013-10-28 20:47:59

标签: sql sql-server syntax triggers

我遇到了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那样),我必须显示错误消息。如果(或者.. :))教师不存在我需要插入他,但我不知道怎么在我的触发器中写这个插入。

2 个答案:

答案 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;

在教师表上需要相同(类似)的触发器。