Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Триггер запрет на удаление записи / 19 сообщений из 19, страница 1 из 1
11.06.2017, 17:51
    #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
11.06.2017, 18:52
    #39470293
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер запрет на удаление записи
МаксиМилТриггер должен запретить удаление рецепта из таблицы "Рецепт" если этот рецепт в "Меню".

Триггер не может делать работу foreign key. Найди другую задачу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
11.06.2017, 20:46
    #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
11.06.2017, 21:16
    #39470321
coborhc
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер запрет на удаление записи
триггер не нужен.

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

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

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

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

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

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

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

Объявляет числовую переменную для сохранения результата запроса.
...
Рейтинг: 0 / 0
12.06.2017, 12:40
    #39470446
la guillotine
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер запрет на удаление записи
efendiНе ставил такой цели.если у кого-то болит голова, это не повод предлагать недорешение, не ставя диагноз.
...
Рейтинг: 0 / 0
12.06.2017, 12:57
    #39470449
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер запрет на удаление записи
efendiНе ставил такой цели. У человека не компилился триггер, я предложил вариант и все.Это показывает, что ты всего лишь тоже ламер, хоть и владеющий синтаксисом.
...
Рейтинг: 0 / 0
12.06.2017, 14:42
    #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
12.06.2017, 14:43
    #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
12.06.2017, 15:01
    #39470499
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер запрет на удаление записи
ламер(ы)но не решит вопроса с инсертом в менюху незакоммиченным

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

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

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

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

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


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