我尝试创建一个审计触发器,它抛出编译错误。
你能帮我创建触发器吗?
DROP TRIGGER DB.DAT_CAMPLE_REQ_Test;
CREATE OR REPLACE TRIGGER DB."DAT_CAMPLE_REQ_Test"
AFTER insert or update or delete on DAT_CAMPLE_REQ
FOR EACH ROW
declare
dmltype varchar2(6);
BEGIN
if deleting then
INSERT INTO h_dat_cample_req VALUES (
:Old.REQUEST_ID,
:Old.SAMPLE_ID,
:Old.CASSAY_ID,
:Old.CASCADE_ID,
:Old.STATUS_ID,
:Old.AUTHOR,
:Old.CRT_SAE,
:Old.SCREEN_SAE
);
else
if inserting then
dmltype := 'insert';
elsif updating then
dmltype := 'update';
end if;
INSERT INTO h_dat_cample_req VALUES
(
:New.REQUEST_ID,
:New.SAMPLE_ID,
:New.CASSAY_ID,
:New.CASCADE_ID,
:New.STATUS_ID,
:New.AUTHOR,
:New.CRT_SAE,
:New.SCREEN_SAE
);
end if;
END;
您没有提供确切的错误信息,也没有提供表h_dat_cample_req
的结构,所以恐怕我不得不猜测。
我怀疑h_dat_cample_req
中的列名不是按照您期望的顺序,或者表中还有其他列您没有在INSERT
语句中指定值。
您正在使用INSERT
语句,而没有列出每个值应该进入的列。使用这种形式的INSERT
语句的问题是,如果表中的列不完全按照您认为的顺序排列,或者有添加或删除的列,您将得到一个错误,并且很难跟踪它。此外,如果没有得到编译错误,仍然有可能将数据插入到错误的列中。为列命名可以明确哪个值放在哪个列中,可以更容易地识别已删除的列,还意味着您不必为表中的所有列指定值—未列出的任何列都将获得NULL
值。
我强烈建议始终在INSERT
语句中命名列。换句话说,与其写
INSERT INTO some_table VALUES (value_1, value_2, ...);
写INSERT INTO some_table (column_1, column_2, ...) VALUES (value_1, value_2, ...);
顺便说一下,你正在给变量dmltype
分配一个值,但你没有在任何地方使用它的值。这不会导致编译错误,但这是一个信号,表明您的触发器可能没有完全按照您的期望进行操作。也许您的h_dat_cample_req
表是一个历史表,并且有一列用于执行操作的类型?