[英]Oracle Database Trigger compilation issue
我正在嘗試使它能夠使我創建的數據庫適應變化。 我有一個雇員表,其中每一行都有雇員另一行的外鍵(這表示每個雇員的經理是誰)。 我想做的是,這樣當我完成一個交換兩名雇員的職位的交易時,外鍵在交易后具有正確的值。
例如,如果我們有:
ID | jobTitle | fk
1 superboss 1
2 boss 1
3 lessboss 2
4 notboss 3
並且我們在一次交易中交換了notboss和更少的boss的職稱和外鍵,我們希望終點表如下所示:
ID | jobTitle | fk
1 superboss 1
2 lessboss 3
3 boss 1
4 notboss 2
我實現這些更改的方式是通過創建一個在jobTitle更新時觸發的觸發器。 它將找到所有具有先前外鍵的行,並將其更改為具有jobTitle舊值的行中的fk值。 由於某種原因,我在CREATE TRIGGER上遇到編譯錯誤。 我已經在下面發布了我的代碼。
CREATE TABLE EmployeeB
(
employeeID integer,
firstName varchar (255),
lastName varchar (255),
phone integer,
jobTitle varchar (255),
payGrade integer,
fk_EmployeeemployeeID integer,
PRIMARY KEY(employeeID),
FOREIGN KEY(fk_EmployeeemployeeID) REFERENCES EmployeeB (employeeID)
ON DELETE SET CASCADE
);
CREATE OR REPLACE TRIGGER ManagerTrigger1A
AFTER UPDATE OF jobTitle ON employeeB
REFERENCING OLD AS OldRow NEW AS NewRow
BEGIN
UPDATE employeeB SET FK_EMPLOYEEEMPLOYEEID = (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle AND rownum <2)
WHERE (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle) != null;
END;
CREATE OR REPLACE TRIGGER ManagerTrigger1B
AFTER UPDATE OF jobTitle ON employeeB
REFERENCING OLD AS OldRow NEW AS NewRow
BEGIN
DELETE FROM employeeB WHERE (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle) = null;
END;
我不確定這是否是解決問題的最佳方法,所以如果我以錯誤的方式進行操作,或者您有更好的主意,請告訴我。 無論哪種方式,我仍然想知道為什么會出現此編譯錯誤。
編輯:忘記了我得到的錯誤。
Error starting at line 1 in command:
CREATE OR REPLACE TRIGGER ManagerTrigger1A
AFTER UPDATE OF jobTitle ON employeeB
REFERENCING OLD AS OldRow NEW AS NewRow
BEGIN
UPDATE employeeB SET FK_EMPLOYEEEMPLOYEEID = (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle AND rownum <2)
WHERE (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle) != null;
END;
Error report:
ORA-04082: NEW or OLD references not allowed in table level triggers
04082. 00000 - "NEW or OLD references not allowed in table level triggers"
*Cause: The trigger is accessing "new" or "old" values in a table trigger.
*Action: Remove any new or old references.
編譯錯誤:
Error(2,1): PL/SQL: SQL Statement ignored
Error(2,97): PL/SQL: ORA-00904: "OLD"."MANAGER"."JOBTITLE": invalid identifier
沒有看到錯誤,很難修復它,但是您可以嘗試:
UPDATE employeeB SET FK_EMPLOYEEEMPLOYEEID = (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle AND rownum <2)
WHERE EXISTS (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle);
和
DELETE FROM employeeB WHERE NOT EXISTS (SELECT employeeID FROM employeeB WHERE jobTitle = :OldRow.jobTitle);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.