我正在努力使它成为我创建的数据库可以适应变化。我有一个员工表,其中每一行都有一个员工中另一行的外键(这表示每个员工的经理是谁)。我想要做的就是这样做,当我完成交换两个员工职位的交易时,外键在交易后具有正确的值。
例如,如果我们有:
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
答案 0 :(得分:0)
如果没有看到错误,很难解决,但你可以尝试:
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);