Arhn - архитектура программирования

Триггер для предотвращения удаления при условии в MySQL

Есть таблица с этой схемой

Исполнители (PerformerID, PerformerName, Street, City, State, Zip, ActivityID)

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

Я пробовал следующий код, но он дает мне синтаксическую ошибку.

CREATE TRIGGER deletePerformer BEFORE DELETE ON Performers 
FOR EACH ROW
BEGIN 
If (Performers.ActivityID FROM INSERTED != Performers.ActivityID FROM Peformers) 
Begin
RAISERROR ('Deletion is Not Allowed!', 16, 1)
Return
End
END;

Буду признателен за любую оказанную помощь.

25.09.2016


Ответы:


1

Правильный синтаксис будет выглядеть примерно так:

DELIMITER $$

CREATE TRIGGER deletePerformer BEFORE DELETE ON Performers 
FOR EACH ROW
BEGIN 
    If (NOT EXISTS (SELECT 1
                    FROM Performers p2
                    WHERE p2.ActivityID = old.ActivityId AND
                          p2.PerformerID <> old.PerformerId
                   )
        ) THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Deletion is Not Allowed!';
    End if;
END

$$

DELIMITER ;

Однако я не уверен, что это лучший подход для обеспечения соблюдения правил, которые вы хотите применить.

25.09.2016
  • Спасибо за Ваш ответ. Эти точки с запятой после «Возврат» и «Конец, если» не должны быть там, верно? Я удалил их и попробовал ваш код, но он все равно выдает ошибку в строке 11. 25.09.2016
  • ОШИБКА 1064 (42000): ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '('Удаление не разрешено', 16, 1) Вернуть конец, если END' в строке 11 25.09.2016
  • @Аркан. . . Это имело бы смысл, потому что RAISEERROR — это то, что использует SQL Server. MySQL использует SIGNAL. 25.09.2016
  • @Аркан. . . Что касается точек с запятой, я обычно ими заканчиваю строки. Возможно, вам нужен оператор delimiter перед определением триггера. 25.09.2016
  • Гордон... Ваш код работает. :) Но это состояние должно измениться на «45000» вместо «4500», а «Начало» и «Возврат» до и после удаления этой строки. С этими изменениями ваш код работает отлично. Спасибо за вашу помощь :) 25.09.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..