【问题标题】:Trigger compiles but doesn't insert rows触发器编译但不插入行
【发布时间】:2019-12-23 05:02:43
【问题描述】:

我正在尝试创建一个触发器,该触发器在触发时会将数据插入到另一个包含 USER 和 SYSDATE 数据的表中。脚本,但没有从 TRIGGER 插入数据。

我正在运行 Oracle 服务器。

 SET SERVEROUTPUT ON;

  CREATE TABLE dept1
 ( DEPTNO NUMBER(3) PRIMARY KEY,
  DNAME VARCHAR2(20),
  LOC VARCHAR2(20)
 );

 CREATE TABLE dept1_shadow
 ( DEPTNO NUMBER(3) PRIMARY KEY,
  DNAME VARCHAR2(20),
  LOC VARCHAR2(20),
  USER_ VARCHAR2(32),
  MODTIME CHAR(17)
  );

 INSERT INTO dept1 VALUES (10, 'ACCOUNTING', 'NEW YORK');    
 INSERT INTO dept1 VALUES (20, 'RESEARCH',   'DALLAS');    
 INSERT INTO dept1 VALUES (30, 'SALES',      'CHICAGO');   
 INSERT INTO dept1  VALUES (40, 'OPERATIONS', 'WASHINGTON (D.C.)');    
 INSERT INTO dept1  VALUES (50, 'MARKETING', 'BOSTON');


CREATE OR REPLACE TRIGGER row_dept1_trigger
 AFTER INSERT ON dept1

 FOR EACH ROW

 DECLARE

 MODTIME CHAR(17);
 USER_ VARCHAR2(32);

 BEGIN

 MODTIME := TO_CHAR(SYSDATE);
 USER_ := User;

 IF INSERTING THEN
 INSERT INTO dept1_shadow (deptno, dname,loc, user_, modtime)
 VALUES (:new.deptno, :new.dname,:new.loc,user_, modtime);
 END IF;

 END;
 /

我没有收到任何错误。

【问题讨论】:

  • 您是否尝试过在创建触发器之后插入记录?发生了什么?因为我有a db<>fiddle here,它显示您的代码工作,创建触发器然后运行您的插入语句的简单权宜之计。
  • @Bohemian 的回答对于您当前的问题是正确的。另外:遵循@Belayer 的建议,将modtime 存储为DATE。如果你不这样做,你就会走向悲伤。还要注意在同一个答案中,您不需要为用户和日期声明变量;只需使用 Oracle 函数。

标签: sql oracle plsql database-trigger


【解决方案1】:

可能,没有提交。如果您按布局顺序运行,则插入会在触发器存在之前完成。可能,没有提交。
几个建议:

  1. 将 modtime 的定义更改为 DATE。将日期存储为字符串最终会导致某个地方出现问题。
  2. 删除两个局部变量,只在 values 子句中使用 USER 和 SYSDATE。
  3. 最后删除 IF INSERTING 语句。您已经定义了一个 AFTER INSERT 触发器,因此 if 语句将始终为真。

所以结果:

create or replace trigger row_dept1_trigger
   after insert on dept1
   for each row
 begin
    insert into dept1_shadow (deptno, dname,loc, user_, modtime)
         values (:new.deptno, :new.dname,:new.loc,user, sysdate);
 end;

【讨论】:

  • 很好地指出日期应该存储为DATE 类型。我希望 OP 遵循它,否则几天内会有新问题询问如何解决“存储为字符串的日期”问题。
【解决方案2】:

在创建触发器之后移动插入语句

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2014-06-19
  • 2018-06-23
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多