Топ контрибуторов
loading
loading
Знаете ли Вы, что

Если у вас есть уникальная статья и вы хотите, чтобы она стала достоянием общественности, вы можете разместить ее на Quizful.

Лента обновлений
ссылка 00:27:28
Комментарий от jikoma9554:
Если перефразировать, то будет звучать так: абстракци...
ссылка Jun 6 16:29
Комментарий от RomChig:
Прошёл, классные тесты, спасибо, респект, есть совсем пр...
ссылка Jun 5 18:51
Комментарий от mnvbmjh:
и где 4 вариант ответа где написано что всё из выше пере...
ссылка Jun 5 14:47
Добавлен вопрос в тест C - Средний уровень
ссылка Jun 5 13:55
Комментарий от dokel:
У відповіді не написано, що це називається Integer Pool, б...
Статистика

Тестов: 153, вопросов: 8597. Пройдено: 460870 / 2255021.

Триггеры MySql

head tail Статья
категория
Базы данных
дата10.09.2012
авторgitarillo
голосов10

ТРИГГЕР - по сути, хранимая процедура, но привязанная к событию изменения содержимого конкретной таблицы.

То есть, задача триггера - уловить изменения записей в заданной таблице, а также вставку записей или их удаление.

Из вышесказанного можно сделать вывод, что триггеры можно использовать, например для логирования действий над какой либо таблицей.

СОЗДАНИЕТРИГГЕРА.

CREATE TRIGGER trigger_name ON table_name trigger_time trigger_event FOR EACH ROW trigger_stmt -

данный запрос используется для создания триггера в общем виде.

trigger_time - вместо этого указывается одно из ключевых слов:

BEFORE - действия триггера производятся до выполнения изменения таблицы;

AFTER - действия триггера производятся после выполнения изменения таблицы;

trigger_event - показывает на какое событие должен реагировать триггер, значения могут быть такие:

INSERT - триггер привязан к событию вставки новой записи;

UPDATE - к событию обновления новой записи;

DELETE - к событию удаления записи;

 

trigger_stmt - представляет собой тело триггера. Для выполнения нескольких операторов внутри тела триггера, необходимо заключить все в блок BEGIN-END.

Приведем пример:

Пусть есть таблица table1 с одним полем FirstName. Создадим еще одну таблицу LogsName с двумя полями: ValueCh, DateChange с соответствующими типами строк дата и время. В эту таблицу триггер будет писать то, что поймает.

Напишем такой запрос:

DELIMITER //

CREATE TRIGGER myTrigger BEFORE INSERT ON `table1`

FOR EACH ROW

BEGIN

INSERT INTO `LogsName` (`ValueCh`, `DateChange`) VALUES (NEW.`FirstName`,  NOW()) ;

END

//

Для начала устанавливаем разделитель //, чтобы он не конфликтовал с ;. В теле триггера указываем один запрос на вставку в таблицу для логов. Причем вставляться будут записи для поля ValueCh - новое значение, которое будет перехвачено из поля FirstName таблицы table1 до его вставки за счет ключевого слова NEW, а также текущая дата и время вставки в поле DataChange.

Таким образом, вне зависимости от того, как мы вставляем запись в таблицу table1, триггер запишет в таблицу логов информацию о новом вставляемом значении и дате его вставки.

Примерно также создается триггер на обновление таблицы:

DELIMITER //

CREATE TRIGGER myTrigger1 BEFORE UPDATE ON `table1`

FOR EACH ROW

BEGIN

INSERT INTO `LogsName` (`ValueCh`, `DateChange`) VALUES (CONCAT(NEW.`FirstName`,'-', OLD.`FirstName`),

,  NOW()) ; 

END

//

В теле триггера используется еще и ключевое слово OLD. В таблицу логов в поле ValueCh будет занесена информация в виде объединения нового значения для изменяемого поля и старого.

Для отлавливание удаления записи создается триггер на удаление. Его запись аналогична.

Для удаления триггера используется запрос:

DROP TRIGGER myTrigger1

Если Вам понравилась статья, проголосуйте за нее

Голосов: 10  loading...
gitarillo   Protagonista89   sintetix   lilili   funbox   veraniko   KristinaPol   olimp2020   Aleke   BulletTrigger