0

我对 MSSQL 触发器有疑问。我想创建触发器,它将检查 id 是否存在于其他表中,如果存在则不会插入记录。

示例我们有 Person,Person 可以是 Student 或 Teacher,但不能同时是 Student 和 Teacher。所以我需要在插入和更新之前检查教师是否存在与我尝试插入的学生相同的 id。我不确定这是否清楚?

我试图找到答案,我找到了一些触发因素,但不是我想要的。你能帮我解决这个问题吗?

我附上我的问题的 UML 图: UML 图

在穆罕默德·阿里的帮助下,我写了这个:

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 或 Teacher,但不能同时是 Student 和 Teacher。因此,如果我想将 Student 插入到我的表中,我必须检查表是哪些教师。如果 Teacher 存在具有相同的 Persson id(例如我尝试插入的 Student),我必须显示错误消息。如果(否则..:))老师不存在我需要插入他,但我不知道如何在我的触发器中编写这个插入。

4

2 回答 2

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的错误,应使用光标。

于 2013-10-29T19:31:59.673 回答
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;

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

于 2013-11-12T22:53:10.833 回答