データベース内のいくつかのテーブルに自動入力するトリガーとプロシージャを作成しようとしています。ユーザーとユーティリティの 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で何をしたいですか。
- ユーザーが USERS テーブルに INSERTED されると、トリガーが起動されます。
- このトリガーは、作成されたユーザーの一連のユーティリティを UTILITIES テーブルに挿入します (User_ID は、作成されたばかりの User_ID と一致します)。
- ユーティリティが 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'
なぜこれが起こっているのか誰にも分かりますか?どんな情報でも大歓迎です。ありがとう!