sql - 创建将获取其新数据以插入新表 oracle 的触发器
问题描述
数据库服务器:Oracle 11g
我需要有关如何使用触发器将 2two 表中的信息获取到审计表中的帮助。
我有两个具有一对多关系的表。
父表:
CREATE TABLE "CLIENT_DETAILS" (
ID NUMBER(12) PRIMARY KEY NOT NULL ENABLE,
FIRSTNAME VARCHAR2(20) NOT NULL,
RATING NUMBER(3) NOT NULL,
BIRTHDATE DATE NOT NULL
);
儿童桌:
CREATE TABLE "CLIENT_ORDERS" (
ID NUMBER(12) PRIMARY KEY NOT NULL ENABLE,
CLIENT_DETAILS_ID NUMBER(12) REFERENCES CLIENT_DETAILS(ID),
REMARKS VARCHAR2(50) NOT NULL,
DATE_TRANS TIMESTAMP NOT NULL
);
审核表:
CREATE TABLE "CLIENT_ORDERS_AUDIT" (
CLIENT_DETAILS_ID NUMBER(12) NOT NULL,
FIRSTNAME VARCHAR2(20) NOT NULL,
REMARKS VARCHAR2(50) NOT NULL,
BIRTHDATE DATE NOT NULL,
RATING VARCHR2(3) NOT NULL,
DATE_TRANS TIMESTAMP NOT NULL
);
父触发器:
CREATE OR REPLACE TRIGGER "CLIENT_DETAILS_TRG"
BEFORE INSERT ON "CLIENT_DETAILS"
FOR EACH ROW
DECLARE
v_user VARCHAR2(50);
BEGIN
IF INSERTING THEN
INSERT INTO "CLIENT_ORDERS_AUDIT"
(ID, FIRSTNAME, REMARKS, BIRTHDATE, RATING, DATE_TRANS)
VALUES (:NEW.ID, :NEW.FIRSTNAME, NEW:RATNG, :NEW.BIRTHDATE);
END IF;
END;
/
COMMIT;
EXIT;
儿童触发:
CREATE OR REPLACE TRIGGER "CLIENT_ORDERS_TRG"
BEFORE INSERT ON "CLIENT_ORDERS"
FOR EACH ROW
DECLARE
v_user VARCHAR2(50);
BEGIN
IF INSERTING THEN
INSERT INTO "CLIENT_ORDERS_AUDIT"
(REMARKS, DATE_TRANS)
VALUES (:NEW.REMARKS, :NEW.DATE_TRANS');
END IF;
END;
/
COMMIT;
EXIT;
Audit 表包含来自 CLIENT_DETAILS 和 CLIENT_ORDERS 表的组合列。如何使用触发器将所有信息输入到审计表中?
我最初所做的是创建两个触发器。当父子表中发生插入时,这两个触发器将数据插入到审计表中。但是每次我将数据插入 Client_Orders (子)表时,我都会遇到约束冲突,即父表中的列必须不为空。
无论如何我可以在审计表中插入数据吗?请给我一些光。我试图搜索,但找不到解决方案。谢谢。
解决方案
推荐阅读
- android - KivyMD NavigationDrawerIconButtons 未出现
- swiftui - 如何在带有表单的 NavigationView 中避免使用分隔符?
- django - 匿名用户在自定义用户模型中没有属性 _meta
- python - 是否可以将数字放在 matplot 直方图的顶部?
- ansible - ansible 从主机读取 IP 地址
- javascript - 需要在 d3 v5 中的 x 和 y 轴内创建一条线
- c++ - 找到连接 2N 个点的线段的最小总长度
- javascript - magnific-popup 基本实现不起作用
- python - 如何在 Keras 自定义损失函数中整合之前的预测?
- java - 复杂作业的 Spring Batch 性能改进