我在创建一个而不是插入触发器时遇到了问题,我希望有人可以指出我做错了什么。 我有一个包含员工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
希望有人可以帮助我! 感谢
答案 0 :(得分:0)
您声明了两个变量,但从未设置它们。在编写INSERT触发器时,SQL公开了一个名为 inserted 的特殊表,该表保存调用进程尝试插入的值。有关详细信息,请参阅以下链接。
答案 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的东西。