Я попытаюсь ответить в очень общем смысле (вы указали, что это не предназначено для конкретной реализации).
Прежде всего, триггер написан на том же языке манипуляции данными, который вы использовали бы для хранимой процедуры. Таким образом, с точки зрения возможностей триггер и хранимая процедура одинаковы.
Но ...
триггер гарантированно будет вызываться каждый раз, когда вы изменяете данные, независимо от того, если вы сделаете это через хранимые процедуры, другой триггер, или вручную выполнение SQL заявления. Фактически вы можете ожидать, что триггер будет всегда выполнить (для его триггерного оператора) , если вы явно не отключили его.
Хранимая процедура, с другой стороны, это гарантировано никогда не запускать сам по себе , если вы явно не запустить его.
Это имеет важное значение: триггеры лучше обеспечивают согласованность. Если кто-то в спешке удаляет запись в вашем живом, например, набрав:
Delete from tablex where uid="QWTY10311"
любое бухгалтерское действие реализуется как триггер будет выполняться, а если забудет пользователь (или злонамеренно избежать) после этого с
Execute SP_TABLEX_LOG("DELETE","QWTY10311")
Ваша БД будет просто потерять данные молча.
Триггеры имеют две другие важные характеристики, которые можно дублировать хранимыми процедурами только за счет дополнительных (иногда значительно более дорогих) усилий.
Прежде всего, они записываются по записи. Поэтому, если вы удаляете 1 миллион записей, запись будет выполняться для каждой операции. Удачи, вызывая соответствующую хранимую процедуру с 1 миллионом строк курсора в качестве параметра, ESPECIALLY, если вы хотите сделать это после ручной операции, как в моем примере выше.
Второе преимущество: триггеры имеют специальную область, в которой они могут ссылаться на значения до и после изменения для каждого поля. Итак, если вы увеличиваете таблицу цен на 10% и хотите зарегистрировать то, что было в предыдущем значении, и какой пользователь выполнил действие в какое время, у вас будут «старое значение», «новое значение», «пользователь» -id "и" timestamp "для любой операции, которую вы можете захотеть сделать. Опять же, выполнение этого путем вызова хранимой процедуры означает, что вам нужно сохранить значения, чтобы передать их в хранимую процедуру при ее запуске.
Так зачем же с SP обращаться в любом случае? (на этот вопрос, надеюсь, будет ваш вопрос о «наилучшем варианте использования»).
Сохраненная процедура лучше, когда вам нужно создать сложную бизнес-логику, которая будет вызываться прикладным уровнем. Поэтому, если вы хотите узнать, например, сколько гостиничных номеров доступно между двумя датами и с дополнительным требованием разрешить домашним животным, триггер не будет хорошей идеей. Тем более, что триггер не возвращает результат в вызывающий процесс ... Так что в любое время вам нужно получить результат вызывающему, будь то запрос, расчет или что-либо еще, имеющее параметры OUTPUT, триггер бесполезно.
Триггеры должны использоваться для обеспечения согласованности. Если запись заголовка не должна быть удалена, если у нее нет детей в других таблицах, возможно, это может привести к срабатыванию триггера. Если вам нужно регистрировать тех, кто изменяет значение в поле, независимо от того, как использовать триггер. Во всех других случаях используйте хранимую процедуру (помните, что триггеры будут влиять на отзывчивость любого обновления данных, как и индексы).
Это ** очень ** RDBMS. –