日期:2014-05-17  浏览次数:20428 次

创建触发器出现问题,哪位高手帮我看一下,多谢?
inserted是employee的子集,感觉没有必要连接啊?
USE pubs
IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'employee_insupd' AND type = 'TR')
   DROP TRIGGER employee_insupd
GO
CREATE TRIGGER employee_insupd
ON employee
FOR INSERT, UPDATE
AS
DECLARE @min_lvl tinyint,
   @max_lvl tinyint,
   @emp_lvl tinyint,
   @job_id smallint
SELECT @min_lvl = min_lvl, 
   @max_lvl = max_lvl, 
   @emp_lvl = i.job_lvl,
   @job_id = i.job_id
/*这里为什么要连接 employee表。employee e INNER JOIN inserted
inserted是employee的子集,感觉没有必要连接啊?这样就行了啊:
FROM  inserted i INNER JOIN jobs j ON j.job_id = i.job_id
   */
FROM employee e INNER JOIN inserted i ON e.emp_id = i.emp_id 
   JOIN jobs j ON j.job_id = i.job_id
IF (@job_id = 1) and (@emp_lvl <> 10) 
BEGIN
   RAISERROR ('Job id 1 expects the default level of 10.', 16, 1)
   ROLLBACK TRANSACTION
END
ELSE
IF NOT (@emp_lvl BETWEEN @min_lvl AND @max_lvl)
BEGIN
   RAISERROR ('The level for job_id:%d should be between %d and %d.',
      16, 1, @job_id, @min_lvl, @max_lvl)
   ROLLBACK TRANSACTION
END

------最佳解决方案--------------------
认真看了下,@min_lvl = min_lvl, @max_lvl = max_lvl,如果创建触发器不报错,可以推断是jobs的字段,没必要连employee了,维持1楼判断。

FOR UPDATE触发器,有时候需要连deleted,获得UPDATE之前的数据,不是employee,2楼一时短路信口开河了。

这个触发器写得真的不咋滴,改代码不如重写好了,如果学习目的这些代码少看。
------其他解决方案--------------------
的确是没有必要
------其他解决方案--------------------
引用:
的确是没有必要


晕,有必要,UPDATE。

------其他解决方案--------------------
为什么?
引用:
引用:
的确是没有必要

晕,有必要,UPDATE。

------其他解决方案--------------------
该回复于2012-11-05 14:31:52被管理员删除