2017-06-04 74 views
1

我有三个表:编写的SQL Server触发器 - 错误

  • Bus_Driver(drNo,drName,工资,StationNo,经验)

  • (StationNo,地址,所属区,薪资委员会)

  • 清洁剂(Cleaner_No,Cname,StationNo)

问题是写一个触发器。它规定,如果公共汽车司机的工资比原来的工资增加20%,那么增加值的0.05%将作为工资佣金转入他的工作岗位。

我设法写了一半的触发器,但当我不得不将数额转移到另一个表时卡住了。

我的代码是:

CREATE TRIGGER tr_1 
ON Bus_Driver 
AFTER INSERT 
AS 
BEGIN 
    DECLARE @salary MONEY 
    SET @Salary = 0 

    SELECT @Salary= salary 
    FROM Inserted 
    WHERE @Salary > (120/100 * @Salary) 

谁能帮我怎么写的下一步骤请

回答

0

您需要停下来重新开始。

首先,您需要赶上AFTER UPDATE事件 - 而不是插入 - 因为您想在薪水更新时(现有值替换为更高的值)执行某些操作。

其次,触发器就会被调用一次每UPDATE声明,如果UPDATE影响超过一个排,DeletedInserted伪表将包含多行数据 - 让你的SELECT @Salary = salary FROM Inserted声明注定 - 它会取一个任意排并忽略所有可能受到影响的其他人。

UPDATE情况下,Inserted将具有新值(更新之后),而Deleted具有旧值(更新之前) - 所以这两个伪表之间的差异可被用于图如果出工资增幅超过了20%!

CREATE TRIGGER trBusDriverSalaryIncrease 
ON dbo.Bus_Driver 
AFTER UPDATE 
AS 
BEGIN 
    -- declare a table variable to hold all revelant values 
    DECLARE @RelevantIncreases TABLE (drNo INT, StationNo INT, SalaryIncrease DECIMAL(18,2)) 

    -- find those bus drivers who have had a more than 20% increase in their salary 
    INSERT INTO @relevantIncreases (drNo, StationNo, SalaryIncrease) 
     SELECT 
      i.drNo, i.StationNo, -- Driver and Station No 
      (i.Salary - d.Salary) -- Salary increase in absolute numbers 
     FROM 
      Deleted d 
     INNER JOIN 
      Inserted i ON d.drNo = i.drNo 
     WHERE 
      -- Salary increased by more than 20% 
      i.Salary > 1.2 * d.Salary 

    -- now that we have all the relevant bus drivers and their salary increase 
    -- insert this into the Station.Salary_Commission column 
    UPDATE s 
    SET Salary_Commission = s.Salary_Commission + ri.SalaryIncrease * 0.0005 
    FROM dbo.Station s 
    INNER JOIN @RelevantIncreases ri ON ri.StationNo = s.StationNo 
END 
+0

根据Microsoft准则,超过五张表不允许加入SQL Server。这是对的吗?如果不正确,按照您的观点,允许在SQL Server中允许加入多少表以获得更好的性能。 – RGS

1

你写的触发是错误的。

第一个,它是插入的触发器,而问题表明薪水被提高,这意味着它应该是更新的触发器。

第二个,你的触发器假定只有一行将在插入的表中。但是,这种假设是错误的。 SQL服务器中的触发器每个语句触发,而不是每行,这意味着插入(和删除)的表可能包含零个,一个或多个行。

此问题的解决方案将写入更新的触发器,这将反过来更新站表。事情是这样的:

CREATE TRIGGER tr_Bus_Driver_Update ON Bus_Driver 
FOR UPDATE 
AS 

    UPDATE s 
    SET Salary_Commission = Salary_Commission - 
          (0.0005 * D.Salary) + -- Remove old salary of the driver(s) from salary_commition. 
          (0.0005 * I.Salary) -- add new salary of the driver(s) to salary_commition 
    FROM Station s 
    INNER JOIN Inserted I ON s.StationNo = I.StationNo 
    INNER JOIN Deleted D ON I.drNo = D.drNo -- assuming drNo is unique in Bus_Driver table 
    WHERE I.Salary >= D.Salady * 1.2 -- You might need to cast to a floating point data type if the Salary is an integer data type 

注意你可能需要将工资转换为浮点数据类型,如果薪水时,它在这触发使用整数数据类型。

+0

**妈**你键入快速..... :-) :-) –

+0

当你在那里键入评论我顺利进入我的打字答案... –