Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер с тремя ограничениями / 8 сообщений из 8, страница 1 из 1
07.06.2015, 18:48:06
    #38978491
dk17
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
Здравствуйте, мне задали задание - сделать в одном триггере 3 ограничения (INSERT, UPDATE, DELETE) для одной таблицы.
Подскажите пожалуйста как это вообще можно реализовать в mysql?
Например в Microsoft SQL Server 2005 триггер с 3мя ограничениями выглядит следующим образом:

create trigger trig3
on dbo.СПОРТСМЕН
AFTER INSERT, UPDATE, DELETE
as
begin
...

пробовал также в mysql, выводит ошибку:
CREATE TRIGGER one BEFORE INSERT, UPDATE,DELETE ON athletes
FOR EACH ROW
BEGIN
...
END;
...
Рейтинг: 0 / 0
07.06.2015, 19:53:52
    #38978502
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
dk17Здравствуйте, мне задали задание - сделать в одном триггере 3 ограничения (INSERT, UPDATE, DELETE) для одной таблицы.

Во-первых, INSERT, UPDATE и DELETE - не "ограничения", а типы события изменения набора записей таблицы.
Во-вторых, один триггер обрабатывает только один тип события.
Так что тот, кто дал тебе такое задание - безграмотный [censored]. Ну при условии, конечно, что ты донёс до нас задание, не исказив его смысл...
...
Рейтинг: 0 / 0
07.06.2015, 20:10:20
    #38978506
dk17
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
Akina,

я донёс до вас смысл)))
В начале учебы нам давали на выбор любой сервер для языка sql. Большинство выбрало Microsoft SQL Server 2005.
Я выбрал MySQL, мне он показался более удобен)

На сервере Microsoft SQL Server 2005 триггер с тремя событиями выглядит следующим образом:

create trigger trig3
on dbo.СПОРТСМЕН
AFTER INSERT, UPDATE, DELETE

as
begin
set nocount on;
begin
if (select код_вида_спорта from inserted)<> any(select код_вида_спорта from dbo.ВИД_СПОРТА)
begin
rollback
print 'Не существует вида спорта с данным номером'
end
if (select Разряд from deleted)='МСМК'
begin
rollback
print 'Нельзя удалять мастера спорта международного класса'
end
if (update (дата_рождения))
begin
RAISERROR ('Нельзя изменять данные о дате рождеия спортсмена, данные заносятся только при добавлении спортсмена.', 1, 11)

И я не понимаю, как такое можно реализовать в mysql(
...
Рейтинг: 0 / 0
07.06.2015, 20:13:16
    #38978508
dk17
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
Akina, получается, что подобное нельзя реализовать в mysql, если один триггер привязан только к одному событию (а в Microsoft SQL может привязываться к трём)?
...
Рейтинг: 0 / 0
08.06.2015, 09:25:10
    #38978651
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
Странный вопрос. Каждая СУБД, каждый диалект реализуют триггеры по-своему. Например, В MySQL нет триггера INSTEAD OF, а в MS SQL нет триггера BEFORE... В MySQL триггеры - строчные, в то время как в MS SQL - табличные... Различий - море, так что на MS SQL не то что кивать - про него даже вспоминать не следует.
...
Рейтинг: 0 / 0
08.06.2015, 10:11:05
    #38978706
Alex_Ustinov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
dk17,сделать в одном триггере 3 ограничения
задание заточено не под MySQL на одно событие - один триггер
обработки ошибок reiseerror тоже нет

можно реализовать в MS SQL Server, в PostrgeSQL
3 в одном в PostrgeSQL реализуется легко
Код: sql
1.
INSERT OR DELETE OR UPDATE


в триггере идет только вызов функции
аналог reiseerror есть -
Код: sql
1.
2.
3.
EXCEPTION
  WHEN [...] THEN
    RAISE NOTICE

lkz jдля обучения PostgreSQL гораздо шире чем MySQL
...
Рейтинг: 0 / 0
08.06.2015, 15:25:08
    #38979141
alex564657498765453
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
dk17Akina,

я донёс до вас смысл)))
В начале учебы нам давали на выбор любой сервер для языка sql. Большинство выбрало Microsoft SQL Server 2005.
Я выбрал MySQL, мне он показался более удобен)

На сервере Microsoft SQL Server 2005 триггер с тремя событиями выглядит следующим образом:

create trigger trig3
on dbo.СПОРТСМЕН
AFTER INSERT, UPDATE, DELETE

as
begin
set nocount on;
begin
if (select код_вида_спорта from inserted)<> any(select код_вида_спорта from dbo.ВИД_СПОРТА)
begin
rollback
print 'Не существует вида спорта с данным номером'
end
if (select Разряд from deleted)='МСМК'
begin
rollback
print 'Нельзя удалять мастера спорта международного класса'
end
if (update (дата_рождения))
begin
RAISERROR ('Нельзя изменять данные о дате рождеия спортсмена, данные заносятся только при добавлении спортсмена.', 1, 11)

И я не понимаю, как такое можно реализовать в mysql(

и что в ms sql это творение работает...я призабыл уже..но
мне интуиция подсказывает, что при удалении
(select код_вида_спорта from inserted) - это либо вызовет ошибку изза отсутсвия таблицы инсертид
либо будет неверная логика

if (select Разряд from deleted)='МСМК' ...а если удаление такое что с разными разрядами удаляються строчки... первая с не МСМК, вторая с ним... ??
...
Рейтинг: 0 / 0
10.06.2015, 15:50:42
    #38981284
dk17
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Триггер с тремя ограничениями
Всем спасибо за помощь и советы!
Создал три триггера для одной таблицы, но с разными событиями.
С выводом (обработкой) ошибки на экран, в MySQL, разобрался. За это отвечает следующий синтаксис кода:
Код: sql
1.
2.
3.
IF pval = 1 THEN
    SIGNAL SQLSTATE '45000'
      SET MESSAGE_TEXT = 'An error occurred';
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер с тремя ограничениями / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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