当我使用触发器时将数据插入表中?

时间:2013-12-11 07:47:16

标签: sql sql-server-2012

这是一个触发器

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命令时,没有数据插入表中。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

这是一个破坏的触发因为inserted可以包含多个(或 no )行 - 所以像SELECT @ScalarVariable = column from inserted这样的语句总是错误的。< / p>

这是不必要的,因为你可以在StudentIdcompreq_id列上放置一个UNIQUE约束:

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

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


如果你坚持把它作为一个触发器,那么让一切正确是非常棘手的(这就是为什么我真的推荐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