2016-05-24 36 views
0

我必须在表(员工)中实施触发器,当简单员工的薪水高于其部门经理时,触发器应该“触发”。 而我已经这样做了。SQL TRIGGERS DATABASE

CREATE TRIGGER sal on EMPLOYEE 

AFTER INSERT,UPDATE 
as 
declare @sal int; 
declare @sal_mgr int; 
declare @sal_manager TABLE(sal int) 

SELECT @sal = salary FROM EMPLOYEE 

SELECT @sal_mgr = salary FROM EMPLOYEE join Department on ssn = mgr_ssn where dno=dnumber 

INSERT INTO @sal_manager values (@sal_mgr) 

UPDATE EMPLOYEE SET salary = @sal_mgr-1 where salary >= @sal_mgr 

但是有了这个,我只拿到1名经理的工资,不是所有的我在不同的部门(其只允许每个部门1部经理)

+0

一名员工只有一名经理,不是?那么其他经理人的薪水哪个重要? – oerkelens

+0

每个员工只有1个经理,一个经理有很多员工。这个代码总是获得相同的经理薪水,并将每个员工与他的薪水进行比较。不是他们部门的经理 –

+1

我很惊讶上面的运行!你有多个陈述,但没有开始 - 结束结构。 – Shadow

回答

1

有你的代码2个主要问题:

  1. 正如我在评论中提到,你有触发(显然)内的多个SQL命令,但目前还没有开始...末端结构,以纪念属于触发报表的开始和结束。你的代码也不符合mysql的create trigger syntax

  2. 您所包含的任何sql查询都不会为更新/插入的记录运行,它们会在整个表上运行。这解释了为什么代码将所有内容与同一个管理器进行比较:查询结果集中的最后一个管理器。

的插入/更新记录的字段可以使用NEW关键字来访问(见examples in mysql documentation

SELECT @sal = salary FROM EMPLOYEE; -> not required, it is simply NEW.salary 

SELECT @sal_mgr = salary FROM EMPLOYEE join Department on ssn = mgr_ssn where dno=dnumber; 

上面应该简单地(做哪些字段属于哪个表,因为它是几个假设从您的代码不明确):

SELECT @sal_mgr = salary 
FROM EMPLOYEE 
inner join Department on EMPLOYEE.ssn = Department.mgr_ssn 
where Department.dno=NEW.dnumber 

可以重写基于上述证明+请使用适当的mysql S中的逻辑所有其他查询用于创建触发器并使用开始 - 结束块的yntax。