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:每当我更新员工的状态时创建一个新表的主要内容,如果未能解决你的问题,请参考以下文章

oracle中怎么创建表emp

SQLSERVER2000 怎样将一个查询结果,并将结果写入一个新表

关于oracle 多表关联更新的问题

Oracle:更新旧行时创建新行

SQL Server 触发器:更新查询新旧数据

从oracle中的触发器插入多条记录