要求:
对表OPS_BUILD_ACTIVITY_LABEL
中的列值进行任何更新后,我们必须在ACTIVITY_LABEL_AUDIT_LOG
表格中插入一行,其中列为TABLE_NAME, COLUMN_NAME, OLD_VALUE, NEW_VALUE, UPDATED_BY, UPDATED_DTM
我创建了Trigger,如下所示。使用以下编译错误创建的触发器:
PL/SQL: SQL Statement ignored PL/SQL: ORA-00984: column not allowed here
请帮我解决这个问题。
create or replace TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER UPDATE OF ACTIVITY_LABEL, NOTES
ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
( TABLE_NAME,
COLUMN_NAME,
OLD_VALUE,
NEW_VALUE,
UPDATED_BY,
UPDATED_DTM)
VALUES
('OPS_BUILD_ACTIVITY_LABEL',
'ACTIVITY_LABEL',
OLD.ACTIVITY_LABEL,
NEW.ACTIVITY_LABEL,
NEW.LAST_UPDATED_BY,
NEW.LAST_UPDATED_DTM);
END;
答案 0 :(得分:0)
使用冒号(:
)添加OLD和NEW前缀,如下所示( ORA-00984 因为这个而加注,顺便说一下我假设没有问题列名称:
CREATE OR REPLACE TRIGGER ACTIVITY_LABEL_TRIGGER
AFTER ON OPS_BUILD_ACTIVITY_LABEL
FOR EACH ROW
BEGIN
if ( nvl(:OLD.ACTIVITY_LABEL,'xYz#@!') != nvl(:NEW.ACTIVITY_LABEL,'xYz#@!')
or nvl(:OLD.NOTES,'xYz#@!') != nvl(:NEW.NOTES,'xYz#@!') ) then
INSERT INTO ACTIVITY_LABEL_AUDIT_LOG
(TABLE_NAME,
COLUMN_NAME,
OLD_VALUE,
NEW_VALUE,
UPDATED_BY,
UPDATED_DTM)
VALUES
('OPS_BUILD_ACTIVITY_LABEL',
'ACTIVITY_LABEL',
:OLD.ACTIVITY_LABEL,
:NEW.ACTIVITY_LABEL,
:NEW.LAST_UPDATED_BY,
:NEW.LAST_UPDATED_DTM);
end if;
END;
关于您的评论,我删除了部分UPDATE OF ACTIVITY_LABEL, NOTES
并对 IF语句中的两列ACTIVITY_LABEL
和NOTES
进行了比较。如果您想获取每个更新操作的每个日志,您还应该删除 IF语句。
答案 1 :(得分:0)
感谢您的所有答案,根据您的答案,我最终通过以下代码达到了要求:
{{1}}