Triggers 触发器编译错误,Oracle 11g

Triggers 触发器编译错误,Oracle 11g,triggers,oracle11g,Triggers,Oracle11g,把我的头撞在这个上面一段时间。我正在Oracle11g上构建一个数据库,每当在“数据产品”表上创建一条记录时,我都会尝试将一条记录插入“注册表”表中。注册表表需要自动递增product_id,然后将该product_id用作数据product表上的外键。这是我的触发代码: CREATE OR REPLACE TRIGGER "TR_CAMERA_DP_DPR_CREATE" BEFORE INSERT ON "DD1"."CAMERA_DP" FOR EACH ROW BEGIN :new.

把我的头撞在这个上面一段时间。我正在Oracle11g上构建一个数据库,每当在“数据产品”表上创建一条记录时,我都会尝试将一条记录插入“注册表”表中。注册表表需要自动递增product_id,然后将该product_id用作数据product表上的外键。这是我的触发代码:

CREATE OR REPLACE TRIGGER "TR_CAMERA_DP_DPR_CREATE"
BEFORE INSERT ON "DD1"."CAMERA_DP"
FOR EACH ROW
BEGIN
  :new.product_id := ID_SEQ.NEXTVAL;

  insert into dd1.dp_registry
         (    product_id,
              fs_location,
              parent_group_id,
              product_name,
              shortdes,
              createdate,
              revision )
         values
         (    :new.product_id,
              'placeholder',
              0,
              '_image',
              'description placeholder',
              sysdate,
              0
          );

END;
因此,理想情况下,在不提供产品id的情况下插入dd1.camera_dp将首先在dd1.dp_注册表中插入一条记录,然后使用递增的产品id作为dd1.camera_dp的键字段

insert语句在使用以下硬编码值运行时有效:new.product_id和id_SEQ.NEXTVAL也正常工作。我觉得我错过了一些明显的东西


谢谢

你的代码对我来说非常有效。如果您遇到错误,那么您实际运行的代码与您发布的代码有关

SQL> create table CAMERA_DP(
  2    product_id number,
  3    name varchar2(10)
  4  );

Table created.

SQL> create sequence id_seq;

Sequence created.

SQL> ed
Wrote file afiedt.buf

  1  create table dp_registry
  2           (    product_id number,
  3                fs_location varchar2(100),
  4                parent_group_id number,
  5                product_name varchar2(100),
  6                shortdes varchar2(100),
  7                createdate date,
  8*               revision number)
SQL> /

Table created.

SQL> ed
Wrote file afiedt.buf

  1  CREATE OR REPLACE TRIGGER "TR_CAMERA_DP_DPR_CREATE"
  2  BEFORE INSERT ON "CAMERA_DP"
  3  FOR EACH ROW
  4  BEGIN
  5    :new.product_id := ID_SEQ.NEXTVAL;
  6    insert into dp_registry
  7           (    product_id,
  8                fs_location,
  9                parent_group_id,
 10                product_name,
 11                shortdes,
 12                createdate,
 13                revision )
 14           values
 15           (    :new.product_id,
 16                'placeholder',
 17                0,
 18                '_image',
 19                'description placeholder',
 20                sysdate,
 21                0
 22            );
 23* END;
 24  /

Trigger created.

SQL> insert into camera_dp( name ) values( 'Foo' );

1 row created.

SQL> ed
Wrote file afiedt.buf

  1* select product_id from dp_registry
SQL> /

PRODUCT_ID
----------
         1
如果您得到一个表不存在的错误,常见的罪魁祸首是

  • 实际上,您的表名中有一个输入错误
  • 您没有权限插入到表中。请注意,如果在您的实际代码中,并非所有内容都在同一个模式中,那么我的猜测是,拥有触发器的用户有权通过角色而不是通过直接授权将
    插入
    dpu注册表
    表中。由于通过角色授予的priileges在定义者的权限存储过程块中不可用,这就解释了为什么可以在命令行而不是PL/SQL中执行某些操作

您看到的编译错误是什么?我没有收到任何编译错误,只是ORA-04098触发器无效,在我尝试插入时重新验证失败。当我从用户错误中选择时,它告诉我表或视图不存在。。。。但是,如果我从代码中复制insert语句,并执行该sql(替换为:new.product_id的值),则不会得到任何错误。这强烈地意味着,在创建触发器时会出现错误。如果您使用的是SQL*Plus,请在创建触发器并获得对象创建时有错误的消息后键入
显示错误
,以显示特定错误。或者您可以查询
user\u errors
以查看与该对象关联的语法错误。我想知道是否无法在insert触发器中使用:new值插入到另一个表中。我不知道为什么会这样。非常感谢。关于特权,你可能是对的。我去修补一下,看看我发现了什么。谢谢!这正是问题所在。事实证明,我是在第三方程序(EDR概念)上开发数据库,然后通过sqlplus和两个不同的ID进行测试。EDR Concepts用户拥有比我创建的用户表更多的权限,并且在触发之前没有默认设置“DD1”。