【发布时间】:2022-01-17 05:00:59
【问题描述】:
我正在为一个班级项目做一个触发器。
我有一个名为salesman 的表,其中有一列名为type。表中的所有员工当前拥有type 或full、part 或temp。
触发器的目的是检查新插入的行的type 并确保它与已经存在的三个行之一匹配。如果是,它应该允许插入,如果不是,它应该停止它或将它回滚。感谢您提出任何想法!
这是代码的最新排列。
CREATE TRIGGER trg_validate_emp_type
ON salesman
FOR INSERT
AS
BEGIN
DECLARE @job varchar (20)
SELECT @job = (SELECT type FROM inserted)
IF NOT EXISTS (SELECT 1 FROM salesman WHERE UPPER(type) = UPPER(@job))
BEGIN
ROLLBACK TRANSACTION
PRINT 'employee type not valid'
END
END
【问题讨论】:
-
您假设
INSERT只包含一行;这是不正确的。INSERT可以包含 0+ 行。见The Silent Bug I Find in Most Triggers -
您甚至不应该在这里考虑触发器,这就是存在 检查约束 的原因。
-
你说“确保它与已经存在的三种类型中的一种匹配”这三种类型是从哪里来的?
-
这是一个 AFTER 触发器。所以该行已经被插入了,所以它总是“有效的”。
-
出于多种原因,请勿在生产系统的触发器中使用 PRINT。为了表明发生了错误,您
THROW提供了适当的信息(忽略在这种情况下首选约束的事实)。
标签: sql sql-server tsql triggers