【问题标题】:PL/SQL Triggers in OracleOracle 中的 PL/SQL 触发器
【发布时间】:2016-10-18 00:10:50
【问题描述】:

图片中显示了以下表格。我需要创建一个触发器,将数据从 PAYMENT 表插入到 AUDIT 表中,包括有关付款的信息,例如付款人 (pay_from)、处理付款的 Oracle 用户、约会 ID (apt_id) 和付款的患者(患者 ID)。

从上图中可以看出,PAYMENT 表与 APPOINTMENT 表有关系,而 APPOINTMENT 表又与 PATIENT 表有关系。

我的问题是,如何使用触发器将 APPOINTMENT 表中的“patient_id”添加到我的 AUDIT 表中? 这是我的代码:

CREATE OR REPLACE TRIGGER PAYMENT_AUDIT_TRIGGER 
AFTER INSERT ON PAYMENT 
FOR EACH ROW 
BEGIN
INSERT
INTO AUDIT_LOG VALUES
(
 AUDIT_LOG_AUDIT_ID_SEQ.NEXTVAL,
 :new.PATIENT_ID,
 :new.APT_ID,
 USER,
 SYSDATE,
 :new.PAY_FROM
);
END;

【问题讨论】:

  • 只查询appointment 表有什么问题?你有apt_id。 (顺便说一句,我认为您需要丢失 sql-server 标签。)

标签: oracle plsql triggers


【解决方案1】:

这在 Oracle 中很容易,因为它同时具有 beforeafter 触发器。可以猜到,它们之间的区别在于它们执行的时间——就在操作之前或之后。

before 触发器可用于拦截输入流以进行更复杂的数据测试和/或修改某些数据(例如从 INSERT 操作中的序列生成键值)。 “就在之前”是指首先执行所有定义的完整性检查——类型检查、检查约束、引用约束等。因此您可以知道数据已经通过了所有这些检查。

after 触发器对于记录刚刚发生的操作很有用。如果有任何错误条件阻止操作完成,即使它可能已通过初始系统检查和 before 触发器可能进行的附加检查,after 触发器也不会执行.这个触发器的一个方便的特性是呈现给它的行将正是被插入/更新/删除的行。这意味着任何生成的键值都将存在于 INSERT 之后 触发器。

此描述适用于具有这两种触发器类型的 Oracle 和其他系统。 SQL Server 只有 after 触发器,尽管它最近扩展了 in 而不是 触发器来处理表——实际上,使其成为 before触发器,尽管与“正常”触发器存在差异,因此用户应阅读文档以了解这些差异。

【讨论】:

    猜你喜欢
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    相关资源
    最近更新 更多