Фактически триггер — это специальный вид хранимой процедуры, которую SQL Server
вызывает при выполнении операций модификации соответствующих таблиц. Триггер
автоматически активизируется при выполнении операции, с которой он связан. Триггеры
связываются с одной или несколькими операциями модификации над одной таблицей.
В разных
коммерческих СУБД рассматриваются разные триггеры. Так, в MS SQL Server триггеры
определены только как постфильтры, то есть такие триггеры, которые выполняются
после свершения события.
В СУБД Oracle
определены два типа триггеров: триггеры, которые могут быть запущены перед реализацией
операции модификации, они называются BEFORE-триггерами, и триггеры, которые
активизируются после выполнения соответствующей модификации, аналогично триггерам
MS SQL Server, — они называются AFTER-тригерами.
Триггеры
могут быть эффективно использованы для поддержки семантической целостности БД,
однако приоритет их ниже, чем приоритет правил-ограничений (constraints), задаваемых
на уровне описания таблиц и на уровне связей между таблицами. При написании
триггеров всегда надо помнить об этом, при нарушении правил целостности по связям
(DRI declarative Referential Integrity) триггер просто может никогда не сработать.
В стандарте
SQL1 ни хранимые процедуры, ни триггеры были не определены. Но в добавлении
к стандарту SQL2, выпущенному в 1996 году, те и другие объекты были стандартизированы
и определены.
Для создания
триггеров используется специальная команда:
CREATE TRIGGER
<имя_триггера> ON <имя_таблицы>
FOR {[INSERT][.
UPDATE] [, DELETE] } [WITH ENCRIPTING]
AS
SQL-операторы
(Тело триггера)
Имя триггера
является идентификатором во встроенном языке программирования СУБД и должно
удовлетворять соответствующим требованиям.
В параметре
FOR задается одна или несколько операций модификации, которые запускают данный
триггер.
Параметр
WITH ENCRIPTING имеет тот же смысл, что и для хранимых процедур, он скрывает
исходный текст тела триггера.
Существует
несколько правил, которые ограничивают набор операторов, которые могут быть
использованы в теле триггера.
Так, в большинстве
СУБД действуют следующие ограничения:
Рассмотрим
пример триггера, который срабатывает при удалении экземпляра некоторой книги,
например, в случае утери этой книги читателем. Что же может делать этот триггер?
А он может выполнять следующую проверку: проверять, остался ли еще хоть один
экземпляр данной книги в библиотеке, и если это был последний экземпляр книги
в библиотеке, то резонно удалить описание книги из предметного каталога, чтобы
наши читатели зря не пытались заказать эту книгу.
Текст этого
триггера на языке Transact SQL приведен ниже:
/* Проверка
существования данного триггера в системном каталоге */
if exists (select * from sysobjects
where id = object_id('dbo.DEL_EXEMP')
and sysstat & Oxf = 8)
drop trigger dbo.DEL_EXEMP
GO
CREATE TRIGGER DEL_EXEMP ON dbo.EXEMPLAR
/* мы создаем
триггер для таблицы EXEMPLAR */
FOR DELETE /*
только для операции удаления */
AS
/* опишем локальные
переменные */
DECLARE @Ntek int
/* количество
оставшихся экземпляров удаленной книги */
DECLARE @DEL_EX VARCHAR(12)
/* шифр удаленного
экземпляра*/
Begin
/* по временной
системной таблице, содержащей удаленные записи, определяем шифр книги, соответствующей
последнему удаленномуэкземпляру */
SELECT @DEL_EX
= ISBN From deleted
/* вызовем хранимую
процедуру, которая определит количество экземпляров книги с заданным шифром
*/
ЕХЕС @Ntek =
COUNT_EX @DEL_EX
/* Если больше
нет экземпляров данной книги, то мы удаляем запись о книге из таблицы BOOKS
*/
IF @Ntek = 0
DELETE from BOOKS WHERE BOOKS.ISBN = @DEL_EXENDGO
Релятивисты и позитивисты утверждают, что "мысленный эксперимент" весьма полезный интрумент для проверки теорий (также возникающих в нашем уме) на непротиворечивость. В этом они обманывают людей, так как любая проверка может осуществляться только независимым от объекта проверки источником. Сам заявитель гипотезы не может быть проверкой своего же заявления, так как причина самого этого заявления есть отсутствие видимых для заявителя противоречий в заявлении.
Это мы видим на примере СТО и ОТО, превратившихся в своеобразный вид религии, управляющей наукой и общественным мнением. Никакое количество фактов, противоречащих им, не может преодолеть формулу Эйнштейна: "Если факт не соответствует теории - измените факт" (В другом варианте " - Факт не соответствует теории? - Тем хуже для факта").
Максимально, на что может претендовать "мысленный эксперимент" - это только на внутреннюю непротиворечивость гипотезы в рамках собственной, часто отнюдь не истинной логики заявителя. Соответсвие практике это не проверяет. Настоящая проверка может состояться только в действительном физическом эксперименте.
Эксперимент на то и эксперимент, что он есть не изощрение мысли, а проверка мысли. Непротиворечивая внутри себя мысль не может сама себя проверить. Это доказано Куртом Гёделем.
Понятие "мысленный эксперимент" придумано специально спекулянтами - релятивистами для шулерской подмены реальной проверки мысли на практике (эксперимента) своим "честным словом". Подробнее читайте в FAQ по эфирной физике.