无法创建SQL Server INSTEAD OF INSERT触发器

时间:2014-11-11 16:11:07

标签: 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(@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

希望有人可以帮助我! 感谢

2 个答案:

答案 0 :(得分:0)

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

http://msdn.microsoft.com/en-us/library/ms191300.aspx

答案 1 :(得分:0)

如所提到的那样,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"在这里围绕你的触发条件,因为CHECK定义了一些可以正常的东西而你的触发器定义了不是 OK的东西。