2013-12-11 43 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

相關問題