Oracle:每当我更新员工的状态时创建一个新表
Posted
技术标签:
【中文标题】Oracle:每当我更新员工的状态时创建一个新表【英文标题】:Oracle: create a new table whenever I update the status of an employee 【发布时间】:2016-07-28 13:38:24 【问题描述】:我有下表,我想在将员工状态更新为“确认”时创建一个新表。新表必须包含包含该特定员工数据的所有列。
SQL> select * from employee;
EMPID EMPNAME SAL DOJ STATUS
----- ------------------------- ---------- --------- --------------------
101 ALEX 10000 12-MAY-16 not_confirmed
102 PETER 20000 12-MAY-16 not_confirmed
【问题讨论】:
这是一个非常奇怪的解决方案...(即很可能是错误的解决方案。请告诉我们问题所在,也许我们可以为您提供更好的选择。) 您真的想在每次更新员工时都创建一个新表吗?当您更新员工时,在employee_history 表中创建一个新行会更有意义。 这不是问题。 它是一个演示。我们试图在我们的项目中实现这些程序(查询)。我们可以通过调用触发器内部的过程来实现吗? @OTTA 不管是不是演示。还是个坏主意。 【参考方案1】:为员工创建一个与员工表结构相同的新表,例如员工历史。
在更新后创建触发器以在历史表中插入旧值 代码可以是:
CREATE OR REPLACE TRIGGER employee_after_update
AFTER UPDATE ON employee
FOR EACH ROW
BEGIN
IF( UPDATING( 'STATUS' ) )
THEN
INSERT INTO employee_history( EMPID, EMPNAME, SAL , DOJ,STATUS)
VALUES( :old.EMPID, :old.EMPNAME , :old.SAL , :old.DOJ , :old.STATUS);
END IF;
结束;
您可以添加额外的跟踪字段(如果需要),例如 update_date 、 user_id(谁进行更改、..)
【讨论】:
这应该是正确答案,但从逻辑上讲,历史记录不应该包含:old
值吗?
@Kevin:谢谢。历史表通常涉及在源表发生更改时制作原始行的完整副本。参考:database-programmer.blogspot.com.eg/2008/07/history-tables.html
再次感谢。好点,我将修改代码以使用:old
1.一个额外的date
列会很方便。 2. 使用:new
记录在该日期/时间更改为哪些值。 3.在insert之后触发并更新捕获初始值。
@Shannon:我同意你的看法,有时可能需要将所有更改添加到具有旧值和新值的列,包括列名,这可能会导致对所有关键表使用具有通用结构的通用历史表.以上是关于Oracle:每当我更新员工的状态时创建一个新表的主要内容,如果未能解决你的问题,请参考以下文章