2016-05-24 72 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。