Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/55: Рейтинг темы: голосов - 55, средняя оценка - 4.76
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 142

Триггер, запрещающий удаление записи

10.01.2016, 15:45. Показов 10856. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Не работает триггер, который запрещает удалять запись в первой таблице, если вторичный ключ содержится во второй таблице. Пытаюсь по-всякому уже его изменить, и все равно удаляется строка. При создании таблицы было ON DELETE CASCADE на внешний ключ. Теперь уже думаю, что зря, т.к. зачем удалять продукт, если он есть в рецепте?
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
ALTER TRIGGER [dbo].[del_product] ON [dbo].[Products]
FOR DELETE
AS
    DECLARE @Id INT
    SELECT @Id = d.IdProducts
    FROM deleted d, Composition c
    WHERE c.IdProducts = d.IdProducts
    IF EXISTS (SELECT *  FROM dbo.Composition 
       WHERE IdProducts = @Id)
       BEGIN
            ROLLBACK TRAN
            RAISERROR ('ОШИБКА, Такое удаление не возможно, так как есть рецепты, для осуществления которых необходим этот продукт',16,10)
        END
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.01.2016, 15:45
Ответы с готовыми решениями:

Триггер, запрещающий удаление записи
Здравствуйте, я не силен в sql, только учусь. В лабе одно из заданий создать триггер, запрещающий удалять информацию о количестве поставок...

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

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

5
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.01.2016, 16:03
Зачем триггер, если есть FK?
Просто пересоздайте FK без каскадных опций.
1
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 142
10.01.2016, 16:06  [ТС]
invm, мне нужно сделать триггер, так задали. вопрос, можно ли обойти каскадное удаление этим триггером, потому что походу из-за него и не работает триггер
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.01.2016, 18:57
Цитата Сообщение от ****777 Посмотреть сообщение
можно ли обойти каскадное удаление этим триггером
Нельзя.
Обойти можно триггером instead of delete. Предвосхищая просьбу показать пример, отвечаю заранее - в документации достаточно примеров триггеров обоих типов.

Если по заданию необходим триггер, не делайте внешний ключ. Вообще.
Или наличие FK тоже оговорено в задании?

Добавлено через 12 минут
Ну и самое главное - ваш триггер не верен.
Не учтена возможность наличия в deleted более одной записи.
Промежуточные переменные вообще не нужны - что мешало запрос на присвоение переменной сразу использовать в предикате exists()?
1
0 / 0 / 0
Регистрация: 30.10.2013
Сообщений: 142
10.01.2016, 19:15  [ТС]
invm, да он тоже нужен. я уже потратила время, перебила бд без on delete cascade, благо таблиц немного.

Добавлено через 8 минут
invm,
Цитата Сообщение от invm Посмотреть сообщение
Не учтена возможность наличия в deleted более одной записи.
есть ли смысл, если удаляю по одной строке. как при этом в deleted может быть более одной строки?

Цитата Сообщение от invm Посмотреть сообщение
Промежуточные переменные вообще не нужны
того же мнения. просто когда не получался нужный результат поначалу думалось на ошибку в триггере, и я пробовала кучу других вариантов. потом уже только дошло, что другая причина.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
10.01.2016, 20:59
Цитата Сообщение от ****777 Посмотреть сообщение
есть ли смысл, если удаляю по одной строке
Всегда есть смысл писать корректный код, вместо некорректного. Тем более, что в данном случае написать корректный гораздо проще.
А если уж решили заложиться на однострочность операций, то в триггере надо проверять сколько строк обрабатывается.
Иначе потом, когда уже будете работать, а не учиться, можно попасть впросак.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.01.2016, 20:59
Помогаю со студенческими работами здесь

Триггер, запрещающий изменение цены, если разница между предыдущей ценой и новой не превышает 300
Создать триггер, который при изменении поля "Цена" таблицы "Детали" контролирует, чтобы разница между новой и старой ценой не превышает...

Триггер на удаление
Здравствуйте. Такой вопрос. Как создать триггер на удаление таблицы. Т.е. если удалить таблицу, то в другой таблице появится информация...

Триггер удаление
Подскажите пожалуйста что удаляет этот триггер??? CREATE TABLE . ( INT IDENTITY (1, 1) NOT NULL, ...

Триггер на удаление
Короче у меня кинотеатр и мне нужно сделать так чтобы когда сеанс кончился то из таблицы сеансы удалить запись об этом и сеансе и занести...

Триггер на удаление
Триггер должен запретить удалять студента, если он один в группе CREATE TRIGGER . ON . FOR DELETE AS IF EXISTS (SELECT ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru