尝试创建一个触发器来跟踪用户对表所做的更改但不断收到错误 ORA-24344:编译错误成功

Posted

技术标签:

【中文标题】尝试创建一个触发器来跟踪用户对表所做的更改但不断收到错误 ORA-24344:编译错误成功【英文标题】:Trying to create a trigger that tracks users changes they make on a table but keep getting error ORA-24344: success with compilation error 【发布时间】:2018-02-25 22:01:59 【问题描述】:
CREATE OR REPLACE TRIGGER placement_audit_trigger 
BEFORE INSERT OR DELETE OR UPDATE ON LDS_PLACEMENT
FOR EACH ROW
ENABLE
DECLARE
v_user varchar(30);
v_date varchar(30);
BEGIN
SELECT user, TO_CHAR(sysdate, 'DD/MON/YYYY HH24:MI:SS') INTO v_user, v_date FROM dual;
IF INSERTING THEN
INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
VALUES(:NEW.PLACEMENT_ID, NULL, v_user, v_date, 'Insert');
ELSIF DELETING THEN 
INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
VALUE (NULL,:OLD.PLACEMENT_ID, v_user, v_date, 'Delete');
ELSIF UPDATING THEN 
INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
VALUES(:NEW.PLACEMENT_ID, :OLD.PLACEMENT_ID, v_user, v_date,'Update');
END IF; 
END;

尝试创建触发器,以跟踪用户在表中所做的更改但保留 ORA-24344:编译错误成功我已经研究并尝试解决问题,谁能告诉我我哪里出错了或指出我正确的方向。

【问题讨论】:

请输入“显示错误;”在收到错误后触发用户下(如果您使用的是 SQLPlus 命令行)或从 user_errors 视图中选择以获取更详细的消息。 您到底为什么将 sysdate 存储并插入为 VARCHAR2? 你可以简单地写像INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation) VALUES(:NEW.PLACEMENT_ID, :OLD.PLACEMENT_ID, USER, SYSDATE,'Update');这样的插入 - 不需要select ... into ... from dual; @WernfriedDomscheit 如何定义进行更改的用户,请阅读问题 @WernfriedDomscheit 是对的 - 将 v_date varchar(30) 更改为 v_date 日期。 【参考方案1】:

你有错别字,一定是

INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
VALUES (NULL,:OLD.PLACEMENT_ID, v_user, v_date, 'Delete');

而不是

INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
VALUE (NULL,:OLD.PLACEMENT_ID, v_user, v_date, 'Delete');

VALUES 而不是VALUE

正如评论中提到的,不需要select ... into ... from dual,所以只需写:

CREATE OR REPLACE TRIGGER placement_audit_trigger 
   BEFORE INSERT OR DELETE OR UPDATE ON LDS_PLACEMENT
   FOR EACH ROW
   ENABLE

BEGIN

   IF INSERTING THEN
      INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
      VALUES (:NEW.PLACEMENT_ID, NULL, USER, SYSDATE, 'Insert');
   ELSIF DELETING THEN 
      INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
      VALUES (NULL,:OLD.PLACEMENT_ID, USER, SYSDATE, 'Delete');
   ELSIF UPDATING THEN 
      INSERT INTO placement_audit (new_name, old_name, user_name, entry_date, operation)
      VALUES (:NEW.PLACEMENT_ID, :OLD.PLACEMENT_ID, USER, SYSDATE,'Update');
   END IF; 
END;

【讨论】:

以上是关于尝试创建一个触发器来跟踪用户对表所做的更改但不断收到错误 ORA-24344:编译错误成功的主要内容,如果未能解决你的问题,请参考以下文章

查找删除记录的用户

MySQL基础篇--在线DDL归纳总结

在 Chrome Devtools 中检测和观察对样式表所做的更改

Oracle 中的审计

是否可以编写t-sql脚本来显示最近对数据库行所做的所有更改?

您将如何审核 ASP.NET 成员表,同时记录哪些用户进行了更改?