2015-05-18 142 views
0

我正在製作一個名爲Employees的表,其中first_namelast_name存儲爲(作爲varchar)。我創建觸發器下面檢查姓和名的組合已經存在:由於'無效的觸發器規範',SQL觸發器無法正常工作

CREATE OR REPLACE TRIGGER VALIDATE_NAME 
BEFORE INSERT ON EMPLOYEES 
IF (SELECT count(*) FROM employees 
    WHERE firs_name = new.first_name AND LAST_NAME = new.last_name) = 0 
    BEGIN 
    END 
ELSE IF (SELECT count(*) FROM employees 
      WHERE firs_name = new.first_name AND LAST_NAME = new.last_name) >= 1 
    BEGIN 
    RETURN FALSE; 
    END; 

不過,我收到一條錯誤消息Invalid trigger specification,我不明白。有人能澄清我做錯了什麼嗎?我已經刪除了第一個BEGIN/END的內容,因爲它只是存儲了它應有的新信息。

P.S .:這是一個理論案例研究,我知道檢查重複條目的正確方法是不使用名字和姓氏,因爲兩個人可能共享相同的名稱。我知道,所以請不要着手它:-)

+0

哪個DBMS? (你的代碼不是ANSI SQL ...) – jarlh

+0

我應該clarrified @jarlh,我使用Oracle與SQL Developer –

+1

我也添加了標籤。 –

回答

1

您的觸發器在其當前形式沒有多大意義。觸發器不是一個函數,所以你不能從它返回一個值。

而且,你的觸發器是不是行級觸發器,但語句級一個,所以你不能引用新的值(因爲你觸發每聲明觸發一次,不是每個) - 一個行級觸發器必須聲明爲FOR EACH ROW

的正確方法,以確保其唯一性是不觸發,而是一種獨特的約束(見AskTom on using triggers):

ALTER TABLE employees ADD CONSTRAINT employees_name_uq UNIQUE(firstname, lastname); 
+0

我已經將它更改爲行級觸發器(因爲我需要驗證新的輸入)。我必須爲這種情況使用觸發器,所以我不能使用這樣的約束。 –

+0

@KevinVoorn不夠公平,但請閱讀我更新的答案中的鏈接,並確保您完全理解使用觸發器執行業務約束的含義。 –

+0

感謝您的幫助,我正在閱讀您的鏈接。 –