2016-11-05 75 views
2

我试图保留对表中数据更改的记录。我读过有很多种方法可以做到这一点,听起来更方便,但在我的情况下,我想用触发器来实现这个功能。我有两个表:SQL触发字段更新以在另一个表中插入新记录

CREATE TABLE Applications 
(
    Application_ID INT NOT NULL, 
    Student_ID INT NOT NULL, 
    Job_ID INT NOT NULL, 
    ApplicationChange_TYPE VARCHAR(64) NOT NULL, 

    PRIMARY KEY (Application_ID), 
    FOREIGN KEY (Student_ID) REFERENCES Students(Student_ID), 
    FOREIGN KEY (Job_ID) REFERENCES Jobs(Job_ID), 

    CONSTRAINT CK_TYPE CHECK (ApplicationChange_TYPE in ('Submitted', 'Withdrawn', 'Invited For Interview', 'Invited to Assessment Centre', 'Rejected', 'Accepted')) 
); 

和:

CREATE TABLE ApplicationChanges 
(
    ApplicationChange_ID INT NOT NULL, 
    Application_ID INT NOT NULL, 
    ApplicationChange_TYPE VARCHAR(64), 
    ApplicationChange_DATETIME DATE NOT NULL, 

    PRIMARY KEY (ApplicationChange_ID), 
    FOREIGN KEY (Application_ID) REFERENCES Applications(Application_ID), 

    CONSTRAINT CK_APPTYPE CHECK (ApplicationChange_TYPE in ('Submitted', 'Withdrawn', 'Invited For Interview', 'Invited to Assessment Centre', 'Rejected', 'Accepted')) 
); 

我想创建一个触发器,这样,当在应用程序表中的记录的ApplicationChange_TYPE字段编辑/更新,新纪录是在ApplicationChanges表中创建。我需要它将Application_ID和ApplicationChange_TYPE从应用程序表中已编辑的记录中继承到ApplicationChanges中的新记录中。 ApplicationChange_DATETIME字段应填入当前日期。

在当前,两个表的主键都使用序列和触发器来自动创建新记录的ID号。

任何输入将不胜感激!如果我一直不清楚,请致歉。

编辑:

此外,我已经作出了这个尝试,但我是那么不确定的,它看起来那么坏,我不认为有在包括它的任何一点。但在这里,它是:

CREATE OR REPLACE TRIGGER ApplicationsUpdateTrigger 
AFTER UPDATE ON Applications 
BEGIN 
    INSERT ApplicationChanges (Application_ID, ApplicationStatus_TYPE, ApplicationChange_TYPE) 
    SELECT Application_ID, ApplicationStatus_TYPE FROM Applications 
    JOIN inserted ON inserted.Application_ID = Applications.Application_ID 
    INSERT INTO ApplicationChanges (Application_ID, ApplicationStatus_TYPE, ApplicationChange_DATETIME) 
    VALUES (NULL, Application_ID, ApplicationStatus_TYPE, GETDATE()) 
END; 
/
+0

我删除了不兼容的数据库标记。请标记您真正使用的数据库。 –

+0

为什么“序列和触发器”而不是“序列和列默认值”? –

+0

问题中没有提到提问者使用SQL Server/TSQL,因此我回滚了这些标签。 –

回答

0

我会与甲骨文坚持为问题标签说(虽然你的样品触发使用GETDATE()提出的SQL Server)。

我不确定要在ApplicationChanges表中存储哪个ApplicationChange_TYPE值:更改前(旧的)还是更改后的(新的)?

让我们介绍两种变体,假设自动递增id列的顺序和触发器正常工作。

  1. 旧值:

    CREATE OR REPLACE TRIGGER ApplicationsUpdateTrigger 
    AFTER UPDATE ON Applications 
    FOR EACH ROW 
    BEGIN 
        IF (:OLD.ApplicationChange_TYPE IS NULL AND :NEW.ApplicationChange_TYPE IS NOT NULL) -- this one is actually redundunt as long as you've got NOT NULL constraint on Application.ApplicationChange_TYPE column 
        OR (:OLD.ApplicationChange_TYPE <> :NEW.ApplicationChange_TYPE) 
        THEN 
        INSERT INTO ApplicationChanges (Application_ID, ApplicationChange_TYPE, ApplicationChange_DATETIME) 
        VALUES (:OLD.Application_ID, :OLD.ApplicationChange_TYPE, sysdate); 
        END IF; 
    END; 
    /
    
  2. 新值:

    CREATE OR REPLACE TRIGGER ApplicationsUpdateTrigger 
    AFTER UPDATE OR INSERT ON Applications 
    FOR EACH ROW 
    BEGIN 
        IF (:OLD.ApplicationChange_TYPE IS NULL AND :NEW.ApplicationChange_TYPE IS NOT NULL) --this check is not redundant (:OLD.ApplicationChange_TYPE will be NULL on inserts) 
        OR (:OLD.ApplicationChange_TYPE <> :NEW.ApplicationChange_TYPE) 
        THEN 
        INSERT INTO ApplicationChanges (Application_ID, ApplicationChange_TYPE, ApplicationChange_DATETIME) 
        VALUES (:NEW.Application_ID, :NEW.ApplicationChange_TYPE, sysdate); 
        END IF; 
    END; 
    /
    

的差异是相当化妆品:第二方案适用于这两个UPDATE和INSERT及用途:新记录值而不是:旧记录值。

相关问题