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

Вы можете подписаться на RSS ленту новых тестов сервиса Quizful, в том числе и отдельно по каждой категории

Лента обновлений
ссылка Oct 22 23:24
Комментарий от alexcei88:
В вопросе переменная s даже не выводиться, а выводитьс...
ссылка Oct 22 17:46
Комментарий от AlexFurm:
Это UB, так можно вызывать только статические функции ч...
ссылка Oct 22 17:43
Комментарий от AlexFurm:
Любые битовые операции с signed это UB
ссылка Oct 21 20:30
Комментарий от yoori:
Любой вариант скомпилируется если компилировать не в конеч...
ссылка Oct 21 16:53
Добавлен вопрос в тест QA (Quality Assurance)
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 443367 / 2177507.

Триггеры MySql

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

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

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

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

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

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

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

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