【问题标题】:SQL TRIGGERS DATABASESQL 触发器数据库
【发布时间】:2016-05-24 15:22:14
【问题描述】:

我必须在表(Employee)中实现触发器,当一个简单的员工获得高于他部门经理的薪水时,触发器应该“触发”。 我已经做到了。

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 位经理)

【问题讨论】:

  • 一名员工只有一名经理,不是吗?那么其他哪些经理的薪水会很重要?
  • 每个员工只有一个经理,一个经理有很多员工。这段代码总是获取相同经理的薪水,并将每个员工与他的薪水进行比较。不是他们部门的经理
  • 我很惊讶上面的运行了!您有多个语句,但没有开始 - 结束结构。
  • 好的,所以您在更新/插入 1 个员工记录时运行此触发器,处理 1 个员工,有 1 个经理,有 1 个薪水。那你为什么要和任何其他经理或他们的薪水做任何事情呢?当您只与单个部门的单个员工打交道时,您似乎想获得“我在不同部门拥有的一切”。
  • 例如,我必须比较部门员工的工资。 1与部门经理。部门员工的工资。 2与部门经理。以此类推。

标签: sql sql-server database triggers


【解决方案1】:

您的代码有两个主要问题:

  1. 正如我在评论中提到的,触发器中有多个 sql 命令(显然),但没有 begin ... end 结构来标记属于触发器的语句的开始和结束。你的代码也不符合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 语法来创建触发器并使用 begin - end 块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-06
    • 2011-07-18
    • 1970-01-01
    • 2020-03-06
    相关资源
    最近更新 更多