2017-06-04 71 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

當你在那裏鍵入評論我順利進入我的打字答案... –