Как триггеры базы данных реализованы в ядре базы данных SQL? - PullRequest
6 голосов
/ 24 февраля 2012

Как триггеры реализованы в ядре базы данных SQL? Я имею в виду не определения триггеров уровня языка SQL, а их базовые реализации в Oracle, SQL Server, MySQL и т. Д. Как механизм базы данных может масштабируемо управлять сотнями или тысячами триггеров? Используют ли они модель публикации-подписки, как с шаблоном наблюдателя / слушателя? Любые ссылки на соответствующую литературу по этому вопросу также будут оценены.

Я сделал Google для «реализации триггера базы данных», но все, что я нашел, было информацией об определениях триггера SQL, что опять-таки не нужно, чтобы я искал.

Ответы [ 3 ]

3 голосов
/ 24 февраля 2012

Триггеры - это обратные вызовы, поэтому реализация может быть такой же простой, как указатели на функции в C. Как правило, от пользователя не ожидается запись пользовательского процедурного кода в СУБД на C, однако. Вам нужно будет поддерживать какой-то другой язык «более высокого уровня». Таким образом, соответствующий шаблон программирования - DSL . Количество триггеров (масштабируемость) само по себе не является проблемой, потому что обычно существует только один, максимум два на таблицу, а события DML запускают только их. Проблема реализации находится в другом месте: в областях согласованности, семантики параллелизма.

1 голос
/ 25 февраля 2012

Во-первых, триггеры - это фрагменты кода, которые запускаются, когда в базе данных происходит конкретное событие (например, INSERT / UPDATE / DELETE для конкретной таблицы). Триггеры выполняются неявно ДО или ПОСЛЕ оператора DML, и триггеры не могут выполняться явно, как хранимые процедуры.

Существует также два типа триггеров - триггеры УРОВНЯ СОСТОЯНИЯ и триггеры УРОВНЯ СТРОКИ.

Триггеры STATEMENT LEVEL срабатывают ДО или ПОСЛЕ выполнения оператора.

Триггеры ROW LEVEL срабатывают ДО или ПОСЛЕ операции, выполняемой для каждой отдельной строки, на которую воздействует операция.

Итак, у нас есть 12 типов триггеров:

 1. BEFORE INSERT STATEMENT
 2. BEFORE INSERT ROW
 3. AFTER INSERT STATEMENT
 4. AFTER INSERT ROW
 5. BEFORE UPDATE STATEMENT
 6. BEFORE UPDATE ROW
 7. AFTER UPDATE STATEMENT
 8. AFTER UPDATE ROW
 9. BEFORE DELETE STATEMENT
 10. BEFORE DELETE ROW
 11. AFTER DELETE STATEMENT
 12. AFTER DELETE ROW

Для события может быть закодировано несколько триггеров с указанием порядка их приоритетности выполнения.

Всякий раз, когда мы выполняем запрос DML (INSERT / UPDATE / DELETE) к базе данных, этот запрос выполняется в транзакции. Следовательно, когда запрос выполняется -

  1. Стол заблокирован
  2. СУБД проверяет наличие триггеров, которые запускаются ДО выполнения инструкции
  3. Выполняет фактическую инструкцию SQL построчно.
  4. Ищите триггер ДО для КАЖДОЙ СТРОКИ. Если найден, исполнен.
  5. Проверка на ошибки. Если есть, откат изменений, внесенных оператором или его триггерами.
  6. Все триггеры ПОСЛЕ КАЖДОЙ СТРОКИ найдены и выполнены.
  7. Все триггеры ПОСЛЕ ЗАЯВЛЕНИЯ найдены и выполнены.

Различные СУБД управляют транзакциями по-разному. За подробностями обращайтесь к их документации.

Многие СУБД хранят триггеры только в текстовом формате, а не скомпилированные хранимые процедуры.

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

1 голос
/ 24 февраля 2012

Вы можете изучить исходные коды баз данных с открытым исходным кодом.Например, Триггер PostreSql .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...