Triggers 触发器编译错误,Oracle 11g
把我的头撞在这个上面一段时间。我正在Oracle11g上构建一个数据库,每当在“数据产品”表上创建一条记录时,我都会尝试将一条记录插入“注册表”表中。注册表表需要自动递增product_id,然后将该product_id用作数据product表上的外键。这是我的触发代码: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.
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
如果您得到一个表不存在的错误,常见的罪魁祸首是
- 实际上,您的表名中有一个输入错误
- 您没有权限插入到表中。请注意,如果在您的实际代码中,并非所有内容都在同一个模式中,那么我的猜测是,拥有触发器的用户有权通过角色而不是通过直接授权将
插入
表中。由于通过角色授予的priileges在定义者的权限存储过程块中不可用,这就解释了为什么可以在命令行而不是PL/SQL中执行某些操作dpu注册表
显示错误
,以显示特定错误。或者您可以查询user\u errors
以查看与该对象关联的语法错误。我想知道是否无法在insert触发器中使用:new值插入到另一个表中。我不知道为什么会这样。非常感谢。关于特权,你可能是对的。我去修补一下,看看我发现了什么。谢谢!这正是问题所在。事实证明,我是在第三方程序(EDR概念)上开发数据库,然后通过sqlplus和两个不同的ID进行测试。EDR Concepts用户拥有比我创建的用户表更多的权限,并且在触发之前没有默认设置“DD1”。