Я пытаюсь создать несколько триггеров и процедур для автоматического заполнения некоторых таблиц в моей базе данных. У меня две таблицы, «Пользователи» и «Утилиты».SQL с использованием процедур вместе с триггерами
Пользователи Таблица:
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 ,
);
Теперь то, что я хотел бы иметь место в моей БД.
- Когда пользователь ВСТАВЛЯЕТСЯ в таблицу ПОЛЬЗОВАТЕЛЕЙ, он запускает триггер.
- Этот триггер затем вставляет кучу Утилит в таблицу UTILITIES (User_ID будет соответствовать только что созданному User_ID) для созданного Пользователя.
- После того, как утилиты были вставлены в таблицу UTILITIES, я хотел бы запустить процедуру, которая будет SUM (Utility_Cost) в таблице UTILITIES, и сохранить SUM в USERS.Memory_Usage ГДЕ ИМЯ USER_ID.
То, что я создал до сих пор:
Trigger стрелять после 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;
Однако, когда я попробуйте ввести 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'
Кто-нибудь знает, почему это происходит? Любая информация будет глубоко цениться. Благодаря!
Таким образом, нет простого способа редактировать триггеры/процедуры, чтобы пользователю автоматически предоставлялись утилиты после того, как они «Вставили в стол? Я должен придумать альтернативный способ вызова моей процедуры ПОСЛЕ того, как мой триггер был уволен? – Blued00d
Да, потому что в триггере вы вставляете другую таблицу, но в процедуре вы обновляете базовую таблицу, в которой происходит фактическая вставка, которая по-прежнему не совершена или не отменена. – anudeepks
Было бы недостаточно, чтобы просто добавить строку 'COMMIT;' после моих вставок, но до того, как моя процедура вызывается в моем триггере? Или это не разрешено? – Blued00d