2013-12-11 46 views
0

下面是当插入一个数据到一个表使用命令的触发当我使用触发器时将数据插入表中?

CREATE TRIGGER [dbo].[CheckApplyId] 
ON [dbo].[AppliedStudent_event] INSTEAD OF INSERT 
AS 
    DECLARE @studentId INT 
    DECLARE @compReq_Id INT 
    BEGIN 
     SELECT @studentId = studentId 
     FROM INSERTED 

     SELECT @compReq_Id = compReq_Id 
     FROM INSERTED 

     IF EXISTS(SELECT StudentId, 
         compreq_id 
        FROM AppliedStudent_event 
        WHERE StudentId = @studentId 
         AND compreq_id = @compReq_Id) 
     BEGIN 
      ROLLBACK 
      PRINT 'User Already Applied' 
     END 
    END 

INSERT INTO AppliedStudent_event (StudentId, compreq_id) 
VALUES (3026, 1) 

消息是:

(1 row(s) affected) 

但是,当我执行SQL命令没有数据插入表中。

回答

0

你能告诉你为什么要使用触发器,因为你只能使用从分配表中插入变量@studentId和@compReq_Id。

0

这是一个破碎的触发器,因为inserted可以包含多个(或没有)行 - 那么像SELECT @ScalarVariable = column from inserted一份声明中永远是错的。

而且它是不必要的,因为你可以放置在StudentIdcompreq_id列的唯一约束:

ALTER TABLE AppliedStudent_event 
ADD CONSTRAINT UQ_Student_Events 
    UNIQUE (StudentId,compreq_id) 

而且它进一步打破,因为你已经指定它作为INSTEAD OF触发器 - 这说代码将负责实际插入 - 但你的代码实际上并没有做到这一点。这就是为什么没有数据在表格中结束的原因。


如果你坚持做它作为一个触发器,它实际上是棘手的一切正确的(这就是为什么我真的建议UNIQUE约束)。它最终会是这样的:

CREATE TRIGGER [dbo].[CheckApplyId] 
ON [dbo].[AppliedStudent_event] INSTEAD OF INSERT 
AS 
    IF EXISTS(select 
       StudentId,compreq_id,COUNT(*) 
       from inserted 
       group by StudentId,compreq_id 
       HAVING COUNT(*) > 1) 
    OR EXISTS (select * 
       from inserted i 
       inner join 
        AppliedStudent_event e 
        on 
        i.StudentId = e.StudentId and 
        i.compreq_id = e.compreq_id) 
    BEGIN 
     ROLLBACK 
     PRINT 'User Already Applied' 
    END 
    ELSE 
    BEGIN 
     INSERT INTO AppliedStudent_event(StudentId,compreq_id /* Other columns? */) 
     SELECT StudentId,compreq_id /* And again, other columns */ 
     FROM inserted 
    END 
+0

感谢它的帮助 – arun

相关问题