2016-12-29 110 views
-3

我想要生成一個觸發器,如果​​表格中的列填充了特定的設置值,例如我有一個名爲'Volunteertype'的專欄,只能分配'學生'的'工作人員',如果學生進入觸發器,則必須取消志願者表中所有與員工詳細信息相關的列,例如'工作區','staffmanager '等下面是代碼,我試圖把利用網站上的資源放在一起,但我沒有運氣。需要sql項目援助

CREATE TRIGGER trg_voltype 
ON Volunteer 
AFTER INSERT 
AS 
IF EXISTS (SELECT NULL FROM inserted i WHERE VolunteerType = 'student') 
FOR EACH ROW BEGIN; 
UPDATE v 
SET Area_of_work  = NULL 
SET StaffManagerName = NULL 
SET StaffManagerEmail = NULL 
SET StaffManagerPhone = NULL 
FROM Volunteer v 
JOIN inserted i ON v.Volunteer_id = i.Volunteer_id 
WHERE v.VolunteerType = 'student'; 
END; 

然而,當這是在Oracle環境內運行產生錯誤ORA-04071:缺少BEFORE,AFTER或INSTEAD OF關鍵字。當我嘗試將'後插入'轉移到關鍵字前我得到'無效觸發'錯誤

是否有人能夠協助和通知我,如果代碼本身是正確/不正確的,我應該如何去修改代碼,預先感謝,並有一個美好的結束年的感謝!

+0

我刪除了MySQL的標籤 – GurV

+1

看一看在[語法](http://docs.oracle.com/database/122/LNPLS/CREATE-TRIGGER- statement.htm#LNPLS01374) – Aleksej

+4

您的觸發器完全格式錯誤;但你的更新也是如此(你不能加入;你有多個'set'子句......) - 你不應該更新剛創建的行,你應該調整更新前的值觸發。是插入一個單獨的表,還是試圖引用新行的值?我建議你回到文檔來嘗試創建更接近有效的東西,並看看你真的被困住了。 –

回答

2

你的觸發器應該是這樣的:

CREATE OR REPLACE TRIGGER trg_voltype 
    BEFORE INSERT ON volunteer 
    FOR EACH ROW 
BEGIN 
    if :new.Volunteertype = 'STUDENT' 
    then 
    :new.Area_of_work := NULL; 
    :new.StaffManagerName := NULL; 
    :new.StaffManagerEmail := NULL; 
    :new.StaffManagerPhone := NULL ; 
    end if; 

END; 
+0

Thnx @Alex Poole在這裏快速修復。 – XING