0

しばらくこれに頭をぶつけます。Oracle 11g でデータベースを構築しており、「データ製品」テーブルでレコードが作成されるたびに、「レジストリ」テーブルにレコードを挿入しようとしています。レジストリ テーブルは product_id を自動インクリメントする必要があり、その product_id はデータ製品テーブルの外部キーとして使用されます。これが私のトリガーコードです:

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;

したがって、理想的には、product_id を指定せずに dd1.camera_dp に挿入すると、最初にレコードが dd1.dp_registry に挿入され、次にそのインクリメントされた product_id が dd1.camera_dp のキー フィールドとして使用されます。

挿入ステートメントは、:new.product_id にハードコードされた値を指定して実行すると機能し、ID_SEQ.NEXTVAL も適切に機能します。明らかな何かが欠けているような気がします。

ありがとう!

4

1 に答える 1

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

テーブルが存在しないというエラーが発生した場合、一般的な原因は次のとおりです。

  • 実際にテーブルの名前にタイプミスがあります
  • テーブルに挿入する権限がありません。実際のコードですべてが同じスキーマにあるわけではない場合、トリガーを所有するユーザーは、直接付与ではなくロールを介してテーブルにアクセスするINSERT権限を持っていると思います。DP_REGISTRYロールを介して付与された権限は定義者権限ストアド・プロシージャ・ブロックでは使用できないため、コマンドラインでは実行できるがPL/SQLでは実行できない理由が説明されます。
于 2013-05-21T21:57:24.850 に答える