Удаление строк в сложном представлении, которое используется триггером - PullRequest
1 голос
/ 27 ноября 2011

Я получаю эту ошибку при попытке удалить строку в представлении

" ORA-01732: операция с данными недопустима в этом представлении "

Команда SQL выдана

DELETE FROM RegisterHelper
WHERE StudentID = 111111111 AND CourseID = 'ASD123';

Это создает ошибки. Я дважды проверил, что эти значения существуют.

Мой взгляд

CREATE VIEW RegisterHelper AS
SELECT studentId, courseID, NULL as position, 'registered' AS status
FROM registeredOn
UNION
SELECT studentId, courseID, position, 'waiting' AS status
FROM waitingOn;

В этом представлении создается полный список ожидающих и зарегистрированных студентов на всех курсах вместе с их статусом (который используется в триггере). Все данные, приведенные здесь, важны для триггера.

Триггер

CREATE OR REPLACE TRIGGER CourseUnregistration
INSTEAD OF DELETE ON RegisterHelper
etc

Таблицы следующие

CREATE TABLE RegisteredOn (
    StudentID REFERENCES Student(StudentID) NOT NULL,
    CourseID REFERENCES Course(CourseID) NOT NULL
);

CREATE TABLE WaitingOn (
    StudentID  REFERENCES Student(StudentID) NOT NULL,
    CourseID REFERENCES Course(CourseID) NOT NULL,
    Position INT NOT NULL,

    PRIMARY KEY(StudentID, CourseID)
);

Поскольку я удаляю только из таблиц со ссылочными значениями, не будет проблем с удалением значений с ссылками (очевидно) - это не должно создавать проблем.

Интересно то, что на самом деле это сработало, выполнив команду DELETE в представлении RegisterHelper несколько часов назад. По какой-то причине он перестал работать, и я не помню, чтобы менял его.

Причина, по которой триггер существует в представлении RegisterHelper, заключается в том, что учащиеся вставляются и удаляются в таблицах RegisteredOn и WaitingOn. Вставки работает нормально, удаление - нет, так как я получаю сообщение об ошибке.

Проще говоря, я просто хочу, чтобы триггер работал, когда что-то удаляется в таблицах RegisteredOn или WaitingOn. Если у кого-то есть другое решение, я открыт для него.

1 Ответ

3 голосов
/ 27 ноября 2011

Вы не можете удалить из представления объединенные таблицы, которые отличаются. Вам нужно будет выполнить два разных оператора удаления, по одному для каждой таблицы.

Обновление

Для того, чтобы сделать операцию такой же легкой из кода, как и отдельное утверждение об удалении, которое вы сейчас ищете, я бы предложил вам создать хранимую процедуру для выполнения удаления и передать информацию об ученике и курсе в этот процесс.

В любом случае это хороший общий дизайн, потому что если вы добавляете дополнительные таблицы, данные которых, возможно, потребуется удалить в будущем в той же логике (например, регистрация в лаборатории), то вам нужно только изменить хранимую процедуру, а не динамический SQL.

...