2013-05-21 5 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.camera_dp без предоставления product_id будет первым вставить запись в dd1.dp_registry, а затем использовать этот инкрементируется product_id в качестве ключевого поля для DD1. camera_dp.

Оператор insert работает при запуске с жестко запрограммированным значением для: new.product_id и ID_SEQ.NEXTVAL также работает правильно. У меня такое чувство, что я пропустил что-то очевидное.

Спасибо!

+0

Какая ошибка компиляции, которую вы видите? –

+0

Я не получаю никаких ошибок компиляции, только триггер ORA-04098 недействителен и не удалось выполнить повторную проверку при попытке вставить. – Dave

+0

, когда я выбираю user_errors, он говорит мне, что таблица или представление не существует .... но если я скопирую инструкцию insert из моего кода и запустим этот sql (со значением, замененным для: 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 

Если вы получаете сообщение об ошибке, что таблица не существует, общие виновники бы

  • Вы на самом деле есть опечатка в названии вашего стола
  • Вы надеваете» t иметь разрешение на вставку в таблицу. Обратите внимание, что если в вашем фактическом коде не все находится в одной и той же схеме, я предполагаю, что пользователь, которому принадлежит триггер, имеет привилегии INSERT в таблице DP_REGISTRY через роль, а не через прямой грант. Поскольку привилегии, предоставленные с помощью роли, недоступны в блоке хранимых процедур прав определителя, это объясняет, почему вы можете что-то сделать в командной строке, но не в PL/SQL.
+0

Большое вам спасибо. Вероятно, вы правы в привилегиях. Собираясь немного помахать ими и посмотреть, что я нахожу. – Dave

+0

Спасибо! Это была точная проблема. Как оказалось, я разрабатывал свою базу данных по сторонней программе (EDR Concepts), а затем тестировал через sqlplus и по двум различным идентификаторам. Пользователь EDR Concepts имел больше разрешений, чем пользовательские таблицы, которые я делал, и не выполнял дефолт «DD1» перед моими триггерами. – Dave

Смежные вопросы