powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер запрет на удаление записи
19 сообщений из 19, страница 1 из 1
Триггер запрет на удаление записи
    #39470287
МаксиМил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте,

помогите, пожалуйста, с триггерами. Я знаю,что это азы и каждый кто начинает программирование уже априори должен был бы их знать... но я как раз только начал изучать азы. :) Хочу создать триггер на запрет удаления. Это база рецептов в ресторане. Создал следующие таблицы "Рецепт", "Меню" и вспомогательную таблицу "Цена". Триггер должен запретить удаление рецепта из таблицы "Рецепт" если этот рецепт в "Меню".

DROP TABLE Menu CASCADE CONSTRAINTS;
DROP TABLE Preis CASCADE CONSTRAINTS;
DROP TABLE Rezept CASCADE CONSTRAINTS;

CREATE TABLE Menu(
Menu_ID NUMBER(20) NOT NULL PRIMARY KEY,
Description VARCHAR2(50)
);

CREATE TABLE PriseS (
Menu_ID NUMBER(20) NOT NULL,
Rezept_ID NUMBER(20) NOT NULL,
Prise NUMBER CONSTRAINT cc_preis CHECK (Preis > 0),
PRIMARY KEY (Menu_ID, Rezept_ID)
);

CREATE TABLE Rezept(
Rezept_ID NUMBER(20) NOT NULL PRIMARY KEY,
Employee_ID NUMBER(20),
Description VARCHAR2(50),
);

CREATE TRIGGER Rezept_in_Menu BEFORE DELETE ON Rezept;
BEGIN
SELECT Prise FROM PriseS
IF Prise › 0
THEN raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
END;

Пишет, что неправильный синтаксис. Я похоже без помощи азы не выучу :(
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470293
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МаксиМилТриггер должен запретить удаление рецепта из таблицы "Рецепт" если этот рецепт в "Меню".

Триггер не может делать работу foreign key. Найди другую задачу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470315
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МаксиМилЗдравствуйте,

помогите, пожалуйста, с триггерами.

CREATE TRIGGER Rezept_in_Menu BEFORE DELETE ON Rezept;
BEGIN
SELECT Prise FROM PriseS
IF Prise › 0
THEN raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
END;

Пишет, что неправильный синтаксис. Я похоже без помощи азы не выучу :(
Попробуй так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TRIGGER Rezept_in_Menu BEFORE DELETE ON Rezept FOR EACH ROW
DECLARE
  vPrice NUMBER;
BEGIN 
SELECT Prise INTO vPrice FROM PriseS WHERE Rezept_Id = :old.Rezept_id;
IF vPrise › 0
THEN raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
EXCEPTION WHEN NO_DATA_FOUND THEN
   NULL;
END;
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470321
coborhc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
триггер не нужен.

нужно:
alter table PriseS add foreign key (Rezept_ID) references Rezept;
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470328
МаксиМил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

спасибо большое за ответ!
А что же тогда делает триггер BEFORE DELETE? Как я понял читая в интернете, для автоматических уведомлений "ошибка" как раз и используют триггеры. Очевидно я неправ. :(
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470330
МаксиМил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
efendi,

спасибо за ответ!
Что делает строка DECLARE vPrice? NUMBER - я понимаю что это.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470337
Бельфя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МаксиМил,

мне в свое время разбираться в азах помогал неплохой курс от Специалиста
Oracle SQL для начинающих и PL/SQL для начинающих.
Советую поискать на просторах интернета и посмотреть.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470355
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МаксиМилDimitry Sibiryakov,

спасибо большое за ответ!
А что же тогда делает триггер BEFORE DELETE? Как я понял читая в интернете, для автоматических уведомлений "ошибка" как раз и используют триггеры. Очевидно я неправ. :(

Триггеры для более сложных кейсов, а ваш кейс - это как раз то, для чего придумали foreign key.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470380
efendiПопробуй такодним триггером FK не реализовать.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470417
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пробовалка сломаетсяefendiПопробуй такодним триггером FK не реализовать.
Не ставил такой цели. У человека не компилился триггер, я предложил вариант и все.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470420
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
МаксиМилefendi,

спасибо за ответ!
Что делает строка DECLARE vPrice? NUMBER - я понимаю что это.

Объявляет числовую переменную для сохранения результата запроса.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470446
la guillotine
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
efendiНе ставил такой цели.если у кого-то болит голова, это не повод предлагать недорешение, не ставя диагноз.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470449
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
efendiНе ставил такой цели. У человека не компилился триггер, я предложил вариант и все.Это показывает, что ты всего лишь тоже ламер, хоть и владеющий синтаксисом.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470490
ламер(ы)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
efendiМаксиМилЗдравствуйте,

помогите, пожалуйста, с триггерами.

CREATE TRIGGER Rezept_in_Menu
BEFORE DELETE ON Rezept;
BEGIN
SELECT Prise FROM PriseS
IF Prise › 0
THEN raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
END;

Пишет, что неправильный синтаксис. Я похоже без помощи азы не выучу :(
Попробуй так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TRIGGER Rezept_in_Menu BEFORE DELETE ON Rezept FOR EACH ROW
DECLARE
  vPrice NUMBER;
BEGIN 
SELECT Prise INTO vPrice FROM PriseS WHERE Rezept_Id = :old.Rezept_id;
IF vPrise › 0
THEN raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
EXCEPTION WHEN NO_DATA_FOUND THEN
   NULL;
END;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TRIGGER Rezept_in_Menu
BEFORE DELETE ON Rezept
FOR EACH ROW
BEGIN 

for rec in
(
SELECT Prise
  FROM PriseS
 WHERE Rezept_Id = :old.Rezept_id
   and rownum=1
   for update
)
loop
    raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
end loop;

END;
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470492
ламер(ы)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ламер(ы)efendiпропущено...

Попробуй так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TRIGGER Rezept_in_Menu BEFORE DELETE ON Rezept FOR EACH ROW
DECLARE
  vPrice NUMBER;
BEGIN 
SELECT Prise INTO vPrice FROM PriseS WHERE Rezept_Id = :old.Rezept_id;
IF vPrise › 0
THEN raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
EXCEPTION WHEN NO_DATA_FOUND THEN
   NULL;
END;



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TRIGGER Rezept_in_Menu
BEFORE DELETE ON Rezept
FOR EACH ROW
BEGIN 

for rec in
(
SELECT Prise
  FROM PriseS
 WHERE Rezept_Id = :old.Rezept_id
   and rownum=1
   for update
)
loop
    raise_application_error (-20000, 'Cannot delete Rezept. It is in the Menu');
end loop;

END;

но не решит вопроса с инсертом в менюху незакоммиченным
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470499
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ламер(ы)но не решит вопроса с инсертом в менюху незакоммиченным

И что будет с твоим триггером когда рецепта в меню таки нет?

SY.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470565
ламер(ы)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SYламер(ы)но не решит вопроса с инсертом в менюху незакоммиченным

И что будет с твоим триггером когда рецепта в меню таки нет?

SY.думаю, таки удалит
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470596
efendi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ElicefendiНе ставил такой цели. У человека не компилился триггер, я предложил вариант и все.Это показывает, что ты всего лишь тоже ламер, хоть и владеющий синтаксисом.

О, великий гуру Elic снизошел до нас простых ламеров, как всегда оскорбляя всех налево и направо и как обычно ничего конкретного божественного не предлагает.
...
Рейтинг: 0 / 0
Триггер запрет на удаление записи
    #39470651
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МаксиМилЯ похоже без помощи азы не выучу :(
Обычно для этого достаточно хорошей книги. А главный аз здесь заключается в том, что реализация ссылочной целостности на триггерах практически всегда ошибочна, а в оставшихся случаях неэффективна. Типичные примеры "ссылочной целостности на триггерах" рушат эту самую целостность, как только с базой начинают работать несколько пользователей одновременно.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер запрет на удаление записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]