Перейти к содержимому


- - - - -

Триггеры. с чем их едят


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 5

#1 Чеченец

Чеченец
  • Новичок

  • Новичок
  • 2 сообщений

Отправлено 08.02.2010 - 16:14

Люди знающие, расскажите, пожалуйста, поподробнее о триггерах в SQL.

#2 Cима

Cима
  • >>Больница сакс<<

  • Power User
  • 1 570 сообщений
  • Пол:Женщина
  • Город:ольда
  • Интересы:Туризм

Отправлено 09.02.2010 - 13:43

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

#3 travanna

travanna
  • Пользователь

  • Пользователь
  • 136 сообщений

Отправлено 09.02.2010 - 22:50

Три́ггер (англ. trigger) — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено наступлением определенного события (действием) — по сути добавлением INSERT или удалением DELETE строки в заданной таблице, или модификации UPDATE данных в определенном столбце заданной таблицы реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически при попытке изменения данных в таблице, с которой он связан. Все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.

Момент запуска триггера определяется с помощью ключевых слов BEFORE (триггер запускается до выполнения связанного с ним события; например, до добавления записи) или AFTER (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись (конечно, при условии, что событие — не удаление записи). Некоторые СУБД накладывают ограничения на операторы, которые могут быть использованы в триггере (например, может быть запрещено вносить изменения в таблицу, на которой «висит» триггер, и т. п.)

Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова BEFORE и AFTER влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.

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

Пример (Oracle):

/* Триггер на уровне таблицы */
CREATE OR REPLACE TRIGGER tr2
AFTER UPDATE ON rayon
BEGIN
  INSERT INTO info VALUES ('table "rayon" has changed');
END;

В этом случае для отличия табличных триггеров от строчных вводится дополнительные ключевые слова при описании строчных триггеров. В Oracle это словосочетание FOR EACH ROW.

Пример:


/* Триггер на уровне строки */
CREATE OR REPLACE TRIGGER tr1
AFTER UPDATE ON rayon FOR EACH ROW
BEGIN
  INSERT INTO info VALUES ('one string in table "rayon" has changed');
END;

#4 pahan76

pahan76
  • Консультант

  • Пользователь
  • 990 сообщений
  • Пол:Мужчина
  • Город:Химки, М.О.

Отправлено 10.02.2010 - 13:55

Дополню, что (по крайней мере) в Oracle есть также триггеры на операторы создания объектов БД CREATE, их изменения ALTER и удаления DROP.  Пример применения - протоколирование подобных событий - запись кто, когда (и зачем :-) ) это сделал.

#5 travanna

travanna
  • Пользователь

  • Пользователь
  • 136 сообщений

Отправлено 10.02.2010 - 22:31

Просмотр сообщенияpahan76 (10 Февраля 2010, 13:55) писал:

Дополню, что (по крайней мере) в Oracle есть также триггеры на операторы создания объектов БД CREATE, их изменения ALTER и удаления DROP.  Пример применения - протоколирование подобных событий - запись кто, когда (и зачем :-) ) это сделал.

а есть триггеры на создание триггеров?

#6 pahan76

pahan76
  • Консультант

  • Пользователь
  • 990 сообщений
  • Пол:Мужчина
  • Город:Химки, М.О.

Отправлено 15.02.2010 - 22:27

Триггер будет срабатывать при любой команде CREATE. А уже изнутри него можно будет проверить тип создаваемого объекта, его имя и владельца.

Подобные триггеры могут быть повешены на всю базу данных (ON DATABASE) или текущую схему (ON SCHEMA).
Кроме CREATE,  ALTER и DROP триггер можно создать на выполнение операторов
ANALYZE - анализ состояния объекта
ASSOCIATE/DISASSOCIATE STATISTICS - добавление/удаление статистики для объекта
AUDIT/NOAUDIT - включение/выключение аудита
COMMENT - создание комментариев для объекта
GRANT/REVOKE - выдача/отмена прав пользователя
RENAME - переименование объекта
TRUNCATE - очистка таблицы
DDL - сразу на все вышеперечисленное.

Кроме протоколирования создания объектов БД с помощью таких триггеров можно, например, запретить изменение/удаление каких-то объектов.

Также есть аналогичные триггеры на события самой БД:
STARTUP - запуск сервера
SHUTDOWN - остановка сервера (кроме аварийной)
SERVERERROR - возникновение ошибок сервера
LOGON - подключение пользователя к БД
LOGOFF - нормальное отключение от БД
Использование - сбор статистики; инициализация сеанса и т.п.

Наконец, есть триггер типа AFTER SUSPEND. Суть - если в сеансе пользователя разрешена приостановка выполнения SQL-инструкций, то при приостановке вызывется данный триггер. Обычно используется для случая остановки выполнения из-за нехватки места для записи данных и пытается автоматически увеличить размер выделенного для хранения пространства. Операции эти достаточно ресурсоемкие, так что перед их использованием стоит рассмотреть требования к конкретной БД.

Также заметьте, что эта информация для Oracle 9 1й версии, которая уже не поддерживается. В актуальных версиях вполне может быть что-нибудь еще интереснее :-)




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 скрытых пользователей