更新触发器帮助

时间:2017-11-17 23:19:41

标签: sql oracle

晚上,需要有关触发器的帮助。

在我的开发环境中,我有两个表,一个包含员工数据(包含将通过ALTER TABLE修改的各种数据错误)和日志表。

如果使用ALTER TABLE sql修改第一个数据表中包含的数据,我如何设计一个更新日志表中包含的多行的触发器,例如'issue_status','status_update_date'?

- 员工表

 CREATE TABLE emp(
emp_id  INTEGER NOT NULL,
emp_name    VARCHAR(30),
emp_postcode    VARCHAR(20),
emp_registered  DATE,
CONSTRAINT  pk_emp PRIMARY KEY (emp_id));

- 日志表的SQL

    CREATE TABLE data_log
    (issue_id NUMBER(2) NOT NULL, 
    table_name VARCHAR2(20),
    row_name VARCHAR2(20),
    data_error_code NUMBER(2),
    issue_desc VARCHAR2(50),
    issue_date DATE, 
    issue_status VARCHAR2(20),
    status_update_date DATE);

- 示例日志插入

    INSERT INTO data_log( SELECT DI_SEQ.nextval, 'emp', emp.emp_id, '1', 'emp_name case size not UPPER', SYSDATE, 'un-fixed', '' FROM emp WHERE emp_name != UPPER(emp_name)); 

这是插入日志表的问题示例。我想要做的就是如果我更新emp表以将'emp_name'设置为Upper,则触发器将注册此更新并将行'issue_status'和'status_update_date'更改为'fixed',并将更改时的'sysdate'更改为由

我已经做了一些浏览但是我仍然在努力理解,任何文献推荐也会受到赞赏。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

请注意,我们不会像您所提到的那样使用ALTER TABLE来更新表的行。我们使用Update语句。您的trigger应该是这样的BEFORE UPDATE TRIGGER

CREATE OR REPLACE TRIGGER trig_emp_upd BEFORE
    UPDATE ON emp
    FOR EACH ROW
    WHEN ( new.emp_name = upper(old.emp_name) )
BEGIN
    UPDATE data_log
        SET
            issue_status = 'fixed',
            status_update_date = SYSDATE
    WHERE
        row_name =:new.emp_id;

END;
/