这是一个触发器
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 :(得分:0)
你能否告诉你为什么使用触发器,因为你只使用插入表中的变量@studentId和@compReq_Id。
答案 1 :(得分:0)
这是一个破坏的触发因为inserted
可以包含多个(或 no )行 - 所以像SELECT @ScalarVariable = column from inserted
这样的语句总是错误的。< / p>
这是不必要的,因为你可以在StudentId
和compreq_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