Не работает триггер AFTER INSERT

Katya111111

При появлении записи в таблице Users триггер должен вставлять запись в таблицу Validation. Все таблицы, связи, последовательности создаются нормально, но у триггера пишет Trigger Entry_validation compiled Errors: check compiler log. Подскажите пожалуйста, где здесь может быть ошибка? Я уже очень долго ищу её и не понимаю. Что у меня не так?
CREATE TABLE Users(
id NUMBER PRIMARY KEY,
user_status varchar2(20) NOT NULL, 
CONSTRAINT check_users CHECK (user_status IN ('менеджер','директор')),
first_name varchar2(50) NOT NULL,
middle_name varchar2(50) NOT NULL,
last_name varchar2(50) NOT NULL,
e_mail varchar2(50) NOT NULL,
password varchar2(50) NOT NULL
);
CREATE TABLE Sample_document(
id NUMBER PRIMARY KEY,
id_manager NUMBER NOT NULL,
theme varchar2(100) NOT NULL,
sample BLOB NOT NULL
);
CREATE TABLE Document(
id NUMBER PRIMARY KEY,
id_manager NUMBER NOT NULL,
sample_document_id NUMBER NOT NULL,
theme varchar2(100) NOT NULL,
signature varchar2(100) NOT NULL,
document_body BLOB NOT NULL,
document_status varchar2(35) NOT NULL,
CONSTRAINT check_document CHECK (document_status IN ('рассмотрение', 'доработка', 'утверждено')),
publication_date DATE NOT NULL,
valid_until_date DATE NOT NULL
);
CREATE TABLE Validation(
id NUMBER PRIMARY KEY,
id_director NUMBER NOT NULL,
id_document NUMBER NOT NULL,
commentt varchar2(1000) NOT NULL,
valid varchar2(20) NOT NULL,
CONSTRAINT check_validation CHECK (valid IN ('принято', 'не принято'))
);
CREATE TABLE Message(
id NUMBER PRIMARY KEY,
id_director NUMBER NOT NULL,
id_document NUMBER NOT NULL,
id_manager NUMBER NOT NULL,
commentt varchar2(1000) NOT NULL,
addresser varchar2(20) NOT NULL,        -- кто отправляет сообщение
CONSTRAINT check_message CHECK (addresser IN ('менеджер', 'директор'))
);
CREATE TABLE Sample_document_User(
id_sample_document NUMBER NOT NULL,
id_user NUMBER NOT NULL
);
 
ALTER TABLE Validation ADD CONSTRAINT fk_id_director FOREIGN KEY (id_director) REFERENCES Users (id);
ALTER TABLE Sample_document_User ADD CONSTRAINT fk_id_sample_document FOREIGN KEY (id_sample_document) REFERENCES Sample_document (id);
ALTER TABLE Sample_document_User ADD CONSTRAINT fk_id_user FOREIGN KEY (id_user) REFERENCES Users (id);
ALTER TABLE Message ADD CONSTRAINT fk_id_director_manager FOREIGN KEY (id_director) REFERENCES Users (id);
ALTER TABLE Document ADD CONSTRAINT fk_id_manager FOREIGN KEY (id_manager) REFERENCES Users (id);
ALTER TABLE Validation ADD CONSTRAINT fk_id_document FOREIGN KEY (id_document) REFERENCES Document (id);
ALTER TABLE Document ADD CONSTRAINT fk_sample_document_id FOREIGN KEY (sample_document_id) REFERENCES Sample_document (id);
ALTER TABLE Message ADD CONSTRAINT fk_id_document_message FOREIGN KEY (id_document) REFERENCES Document (id);
 
CREATE SEQUENCE users_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE validation_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE message_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE document_seq START WITH 1 INCREMENT BY 1;
CREATE SEQUENCE sample_document_seq START WITH 1 INCREMENT BY 1;
 
CREATE OR REPLACE TRIGGER Entry_validation AFTER INSERT ON Document
FOR EACH ROW 
BEGIN
INSERT INTO Validation(id, id_director, id_document, commentt, valid)
VALUES (:NEW.id, :NEW.id_director, :NEW.id_document, :NEW.commentt, :NEW.valid);
END Entry_validation;
 
INSERT INTO Entry_validation (id, id_director, id_document, commentt, valid)
VALUES (validation_seq.NEXTVAL, (SELECT id FROM Users WHERE user_status = 'директор'), (SELECT MAX(id) FROM Document), 'рассмотрение', 'не принято');
8 ответов

Katya111111

ты триггер создаёшь на изменение какой таблицы? Document ?
INSERT ON Document
значит, когда будет идти вставка новой записи в таблицу Document сработает твой триггер?И там будут поля вставляемой записи в таблицу Document и не будет полей ":NEW.id_director, :NEW.id_document, :NEW.commentt, :NEW.valid" в этом твоя ошибка.


Katya111111

Для начала желательно увидеть текст ошибки.
SELECT *
FROM user_errors


Katya111111

Да, триггер должен сработать после вставки в таблицу Document. После вставки записи в Document, должна вставляться запись в таблицу Validation (там как раз поля id, id_director, id_document, commentt, valid). Если мне требуется такое действие от триггера, то я не правильно его пишу или оформляю не так?А текст ошибки вот такой ENTRY_VALIDATION TRIGGER 5 26 34 PLS-00111: end-of-file in comment ERROR 111Что это значит?


Katya111111

Что это значит?
Если все, что здесь приведено, действительно идет одним файлом, то: - команда в SQL*Plus может закачиваться либо ;, либо /. По этому признаку Oracle понимает, что закончилась одна команда и началась другая - если используется блок PL/SQL (а триггер - одна из разновидностей блока), то там ; штатно используется в тексте, причем неоднократно. Поэтому блок PL/SQL обязательно надо заканчивать слэшем / . В противном случае Oracle дальнейшее считает продолжением блока и, не дождавшись слэша до конца файла, выдал соответствующее сообщение.


Katya111111

CREATE OR REPLACE TRIGGER Entry_validation AFTER INSERT ON Document
FOR EACH ROW 
BEGIN
 
INSERT INTO Validation(id, id_director, id_document, commentt, valid)
VALUES (:NEW.id, 
:NEW.id_director, -- такого поля нету в таблице Document
:NEW.id_document, --такого поля нету в таблице Document
:NEW.commentt, -- такого поля нету в таблице Document
:NEW.valid -- такого поля нету в таблице Document
);
 
END;
Таких полей в таблице Document нету: id_director, id_document, commentt, valid. А ты их пытаешься использовать через ":new". Приставка ":new" относится к той таблцие триггер на которую ты создаешь. Судя по названию полей возможно следует вот так писать:
CREATE OR REPLACE TRIGGER Entry_validation AFTER INSERT ON Document
FOR EACH ROW 
v_id_director validation.id_director%TYPE;
v_commentt validation.commentt%TYPE;
v_valid validation.valid%TYPE;
BEGIN
 
-- записываем id_director 
SELECT id_director  INTO v_id_director 
FROM .....
;
 
-- записываем commentt
SELECT commentt INTO v_commentt
FROM ....
;
 
-- по аналогии записываем valid
SELECT valid INTO v_valid
FROM ....
;
 
-- и после уже вставляем их в твою таблицу
INSERT INTO Validation(id_document, id_director, commentt, valid)
VALUES (:NEW.id,v_id_director,v_commentt,v_valid)
;
 
END;


Katya111111

Таких полей в таблице Document нету
Если бы дело было в отсутствии полей в таблице, ошибка была бы другая
PLS-00111 end-of-file in commentCause: A Comment had a comment initiator (/*), but before the Comment terminator (*/) was found, an end-of-file marker was encountered.Action: Remove the Comment initiator or add a comment terminator. The line and column numbers accompanying the error message refer to the beginning of the last legal token before the Comment initiator.


Katya111111

Если бы дело было в отсутствии полей в таблице, ошибка была бы другая
скорее всего, Вы правы. но это не отменяет тот факт, что после корректного закрытия скрипта повалятся следующие ошибки. Как раз те, о которых говорим мы с камрадом Lorsik.и я ещё проглядел в прошлый раз, что за ужас в строках 73-74! Там, похоже, в триггер Entry_validation идёт добавление новой записи(??!!!!!)


Katya111111

В строках 73 -74 - это я не знала, как оформить то, что мне надо вставить запись в Validation именно с такими значениями. Бред конечно полный, согласна. Просматривала сейчас стену с сообщениями, спасибо всем, кто попытался мне объяснить как сделать правильно. Завтра попробую исправить.