我尝试创建一个审计触发器,它会抛出编译错误。
你能帮我创建触发器吗?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;
答案 0 :(得分:0)
您没有提供确切的错误消息,也没有提供表h_dat_cample_req
的结构,所以我担心我不得不猜测。
我怀疑h_dat_cample_req
中的列名不符合您的预期,或者表中还有其他列未在INSERT
语句中指定值。< / p>
您正在使用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
表是一个历史表,并且有一个列用于执行的操作类型?