0

データベース内のいくつかのテーブルに自動入力するトリガーとプロシージャを作成しようとしています。ユーザーとユーティリティの 2 つのテーブルがあります。

ユーザー テーブル:

CREATE TABLE USERS ( 
User_id Number(38,0) NOT NULL PRIMARY KEY, 
User_name char(18) NULL , 
Storage_Size varchar(18) NULL , 
Memory_Usage Number(38,0) NULL 
);

ユーティリティ テーブル

CREATE TABLE UTILITIES ( 
Utility_id Number(38,0) NOT NULL PRIMARY KEY, 
Utility_Name varchar(18) NULL , 
Utility_Cost Number(38,0) NULL , 
Running char(4) NULL , 
User_id Number(38,0) NULL , 
);

今、私は自分のDBで何をしたいですか。

  1. ユーザーが USERS テーブルに INSERTED されると、トリガーが起動されます。
  2. このトリガーは、作成されたユーザーの一連のユーティリティを UTILITIES テーブルに挿入します (User_ID は、作成されたばかりの User_ID と一致します)。
  3. ユーティリティが UTILITIES テーブルに挿入された後、UTILITIES テーブルで SUM(Utility_Cost) を実行し、USER_ID が一致する USERS.Memory_Usage に SUM を保存するプロシージャを実行したいと思います。

私がこれまでに作成したもの:

USERS テーブルの INSERT の後に起動するトリガー:

CREATE OR REPLACE TRIGGER users_after_insert
AFTER INSERT ON USERS
BEGIN
    INSERT INTO UTILITIES (UTILITY_NAME, RUNNING, USER_ID, UTILITY_ID, UTILITY_COST)
    VALUES
    ('Javaw.exe', 'YES', :new.USER_ID, seq_utility_id.nextval
         , round(dbms_random.value(25000, 100000)));
    sum_data();
END;

トリガーから呼び出されるプロシージャ:

CREATE OR REPLACE PROCEDURE sum_data
IS
BEGIN
  UPDATE USERS
  SET MEMORY_USAGE = (SELECT SUM(UTILITY_COST) 
                      FROM UTILITIES 
                      WHERE USERS.USER_ID = UTILITIES.USER_ID)
  WHERE USERS.User_id = :new.User_id;
END;

ただし、 USERS テーブルに INSERT しようとすると、次のようになります。

ORA-04091: table STUDENT052.USERS is mutating, trigger/function may not see it
ORA-06512: at "STUDENT052.SUM_DATA", line 4
ORA-06512: at "STUDENT052.USERS_AFTER_INSERT", line 5
ORA-04088: error during execution of trigger 'STUDENT052.USERS_AFTER_INSERT'

なぜこれが起こっているのか誰にも分かりますか?どんな情報でも大歓迎です。ありがとう!

4

2 に答える 2

0

はい、変異トリガーについて読んでください。同時に挿入されているレコードを更新しようとしていて、複数のユーティリティを挿入しようとしている場合、それは本当に混乱します。代わりに、メモリ使用量を計算する列を含むテーブルのビューを作成してみませんか? または、他のテーブルに基づく users テーブルで仮想列 (または関数ベースの列) を試してください。(テーブル全体でテストしていないため、機能するかどうかはわかりません。)

于 2015-04-24T02:02:06.970 に答える