Наблюдатели против триггеров - PullRequest
3 голосов
/ 21 ноября 2008

Какой общий консенсус?

Если вам нужно изменить базу данных после определенного действия, вы используете шаблон наблюдателя и позволяете инфраструктуре / приложению обработать обновление для вас? Или вы обходите приложение и делегируете обновление триггеру базы данных?

Очевидно, что триггер быстрее, но стоит ли это?

Ответы [ 3 ]

3 голосов
/ 21 ноября 2008

Я использую триггеры, но, как правило, они зависят от базы данных. Если вы планируете поддерживать несколько серверов баз данных, обязательно найдите способ покрыть это в коде. Если вы уверены, что будете использовать определенный сервер БД, то ваша целостность данных понравится вам за ваши триггеры.

3 голосов
/ 21 ноября 2008

Поскольку мы используем LINQ2SQL, эту задачу довольно легко выполнить, переопределяя метод SubmitChanges (). Наша главная цель - провести аудит в наших таблицах. Код хотел бы это:

    /// <summary>
    /// Sends changes that were made to retrieved objects to the underlying database, 
    /// and specifies the action to be taken if the submission fails.
    /// NOTE: Handling this event to easily perform Audit tasks whenever a table gets updated.
    /// </summary>
    /// <param name="failureMode">The action to be taken if the submission fails. 
    /// Valid arguments are as follows:<see cref="F:System.Data.Linq.ConflictMode.FailOnFirstConflict"/>
    /// <see cref="F:System.Data.Linq.ConflictMode.ContinueOnConflict"/></param>
    public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
    {
        //Updates
        for (int changeCounter = 0; changeCounter < this.GetChangeSet().Updates.Count; changeCounter++)
        {
            object modifiedEntity = this.GetChangeSet().Updates[changeCounter];
            SetAuditStamp(this, modifiedEntity, ChangeType.Update);
        }

        //Inserts
        for (int changeCounter = 0; changeCounter < this.GetChangeSet().Inserts.Count; changeCounter++)
        {
            object modifiedEntity = this.GetChangeSet().Inserts[changeCounter];
            SetAuditStamp(this, modifiedEntity, ChangeType.Insert);
        }
        base.SubmitChanges(failureMode);

Нам, в частности, не нравится использовать триггеры, так как они всегда скрыты в вашей БД, и это затрудняет решение проблем, которые могут возникнуть ... имея это в своем коде, вам просто нужно отладить его, чтобы выяснить, почему что-то не получилось, например ...

2 голосов
/ 21 ноября 2008

Если вы не поддерживаете несколько СУБД, ваша структура, скорее всего, изменится в ближайшие 5 лет, чем ваш выбор СУБД. Кроме того, в будущем могут возникнуть требования для поддержки других форм ввода, например, веб-страницы или мобильные устройства. Помещение этих действий в триггеры базы данных означает, что эти действия будут выполняться независимо от приложения, которое их запускает.

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