2013-05-21 3 views
0

잠시 동안이 문제에 대해 머리를 대고 있습니다. Oracle 11g에 데이터베이스를 구축하고 "데이터 제품"테이블에 레코드가 생성 될 때마다 "레지스트리"테이블에 레코드를 삽입하려고 시도하고 있습니다. 레지스트리 테이블은 product_id를 자동 증가시켜야하며, 그 product_id는 데이터 제품 테이블에서 외래 키로 사용됩니다. 여기 내 트리거 코드 :트리거 편집 오류, Oracle 11g

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; 

따라서, 이상적으로, 첫째 dd1.dp_registry에 레코드를 삽입 한 다음 DD1의 키 필드로 그 증가 PRODUCT_ID를 사용하는 PRODUCT_ID를 제공하지 않고 dd1.camera_dp에 삽입. camera_dp.

new.product_id 및 ID_SEQ.NEXTVAL도 하드 코딩 된 값으로 실행하면 insert 문이 제대로 작동합니다. 나는 명백한 것이 빠져 있다는 느낌을 받는다.

감사합니다.

+0

보고있는 컴파일 오류는 무엇입니까? –

+0

컴파일 오류가 발생하지 않습니다. ORA-04098 트리거가 잘못되어 삽입을 시도 할 때 재확인하지 못했습니다. – Dave

+0

user_errors에서 선택할 때 테이블 또는 뷰가 존재하지 않는다고 알려주지 만 코드 삽입 문을 복사하여 해당 값 (new.product_id 값을 바꾼 값)으로 실행하면 얻을 수 있습니다. 오류 없음. – Dave

답변

1

코드가 완벽하게 작동합니다. 오류가 발생하면 게시 한 코드에서 실제로 실행중인 코드에 대해 뭔가가 있습니다.

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 

당신은 테이블이 존재하지 않는다고는 오류가 발생하는 경우 실제로 테이블의 이름에 오타가

  • , 일반적인 범죄자는 것
  • 당신은 돈 ' 테이블에 삽입 할 권한이 없습니다. 실제 코드에서 모든 것이 동일한 스키마에있는 것이 아니라면 트리거를 소유 한 사용자가 에 대한 권한을 직접 부여를 통해 역할이 아닌 DP_REGISTRY 테이블에 입력해야합니다. 역할을 통해 부여 된 권한은 정의 자의 권한 내장 프로 시저 블록에서 사용할 수 없기 때문에 명령 줄에서는 수행 할 수 있지만 PL/SQL에서는 수행 할 수없는 작업을 설명 할 수 있습니다.
+0

정말 고마워요. 당신은 아마도 권한에 관한 것입니다. 그들과 약간 팅커에 가서 내가 찾은 것을 보아라. – Dave

+0

고마워요! 그것은 정확한 문제였습니다. 그것이 제 3 자 프로그램 (EDR 개념)에서 데이터베이스를 개발 한 다음 sqlplus를 통해 테스트하고 두 개의 서로 다른 ID를 사용하여 테스트 한 것입니다. EDR 개념 사용자는 내가 작성한 사용자 테이블보다 많은 권한을 가지며 트리거 전에 "DD1"을 기본값으로 설정하지 않았습니다. – Dave