2013-10-28 40 views
0

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

示例 我们有Person,Person可能是学生或老师,但它不能同时是Student和Teacher。所以我需要检查之前插入和更新,如果教师存在与我试图插入的学生相同的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可能是学生或教师,但它不能在同一时间成为学生和教师。所以,如果我想插入学生到我的桌子,我必须检查哪些Teatchers。如果Teacher存在相同的Persson ID(例如我尝试插入的Student),则必须显示错误消息。如果(或者.. :) :)老师不存在我需要插入他,但是我不知道如何在我的触发器中写入这个插入。

+1

为什么不在人员表中创建一个类型字段(比如personTypeId)来将某个人员标记为Teacher或Student。然后一个记录将是其中的一个,但不是通过设计。即'Person:PersonTypes => 1:多关系' – Kaf

+0

我想过了。但这是我学习的任务,我的老师告诉我最好的解决方案是使用触发器,我想知道如何编写像这样的触发器。 – Purzynski

+0

你想要例外吗?使用'RaIsError',如果有冲突?如果不允许使用INSERT,你的问题有点不清楚如何执行UPDATE。 – HABO

回答

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 

EDIT:我修改它一下,该错误消息,以覆盖多个行插入的局部故障。为了对每个拒绝的id显示错误,应该使用游标。

+0

谢谢大家花费的时间。这个答案对我来说足够了。 – Purzynski

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; 

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