Sql server 创建sql server而不是插入触发器时出现问题

Sql server 创建sql server而不是插入触发器时出现问题,sql-server,sql-server-2008,triggers,Sql Server,Sql Server 2008,Triggers,我在创建一个而不是插入触发器时遇到了问题,我希望有人能指出我做错了什么。 我有一个带有员工id和功能id的表,id为2或4的功能仅对id为1或4的员工可用,任何其他组合都可以。 我创建了这个触发器,但无论插入什么,结果在每列中都是空值 这就是我到目前为止所做的: CREATE TRIGGER TrigInsertEmployee ON employee_func INSTEAD OF INSERT AS BEGIN DECLARE @idEmp int, @idFunc int IF(@id

我在创建一个而不是插入触发器时遇到了问题,我希望有人能指出我做错了什么。 我有一个带有员工id和功能id的表,id为2或4的功能仅对id为1或4的员工可用,任何其他组合都可以。 我创建了这个触发器,但无论插入什么,结果在每列中都是空值

这就是我到目前为止所做的:

CREATE TRIGGER TrigInsertEmployee
ON employee_func
INSTEAD OF INSERT AS

BEGIN
DECLARE @idEmp int, @idFunc int

IF(@idFunc IN (2, 4) AND @idEmp NOT IN (1, 4))
BEGIN
REISERROR('Incorrect functionality', 10, 1)
RETURN
END

INSERT INTO employee_func(idEmp, idFunc) VALUES (@idEmp ,@idFunc)
END
希望有人能帮助我!
谢谢

您声明了两个变量,但从未设置它们。在编写INSERT触发器时,SQL会公开一个名为inserted的特殊表,该表保存调用进程试图插入的值。有关更多信息,请参阅下面的链接


如前所述,插入的
特殊表就是您所需要的。下面是一个例子:

CREATE TRIGGER TrigInsertEmployee
ON employee_func
INSTEAD OF INSERT AS

BEGIN

  IF(INSERTED.idFunc IN (2, 4) AND INSERTED.idEmp NOT IN (1, 4))
    BEGIN
    RAISERROR('Incorrect functionality', 10, 1)
    RETURN
  END

  INSERT INTO employee_func(idEmp, idFunc) VALUES (@idEmp ,@idFunc)
END
此外,它可能只是一个换位错误,但代码中的
RAISERROR
拼写不正确

最后,对于这样一个简单的基于行的规则,您可以使用
CHECK
约束:

ALTER TABLE employee_func
ADD CHECK ( NOT(idFunc IN (2, 4) AND idEmp NOT IN (1, 4)) )

我只是在你的触发条件周围加了一个“NOT”,因为检查定义了一些正常的东西,而你的触发器定义了一些不正常的东西。

你声明了变量
@idEmp
@idFunc
,但你从来没有给它们一个值,所以你当然是在插入
NULL
s