Ответ
1. Триггер в базах данных (СУБД)
Триггер — это хранимая процедура в СУБД, которая автоматически выполняется в ответ на определённые события, связанные с таблицей. Такими событиями могут быть операции INSERT
, UPDATE
или DELETE
.
Пример использования: автоматически обновлять поле updated_at
при любом изменении строки.
2. Реализация концепции в Go
В Go-приложениях логику, аналогичную триггерам, принято реализовывать на уровне кода приложения, а не в самой базе данных. Это даёт больше контроля, упрощает тестирование и делает приложение менее зависимым от конкретной СУБД.
Такой подход реализуется через хуки (hooks) или колбэки (callbacks), особенно в ORM-библиотеках, таких как GORM.
Пример: Хуки в GORM
GORM предоставляет хуки, которые вызываются до или после операций создания, обновления, удаления.
import (
"gorm.io/gorm"
"time"
)
type User struct {
ID uint
Name string
CreatedAt time.Time
UpdatedAt time.Time
}
// BeforeCreate будет вызван перед созданием новой записи
func (u *User) BeforeCreate(tx *gorm.DB) (err error) {
// Устанавливаем текущее время при создании
u.CreatedAt = time.Now()
u.UpdatedAt = time.Now()
return
}
// BeforeUpdate будет вызван перед обновлением записи
func (u *User) BeforeUpdate(tx *gorm.DB) (err error) {
// Обновляем только поле updated_at
u.UpdatedAt = time.Now()
return
}
Сравнение подходов
- Триггеры в СУБД: Логика привязана к данным. Гарантирует целостность, даже если к БД подключаются разные приложения. Сложнее в отладке и версионировании.
- Хуки в коде (Go): Логика находится в приложении. Легко тестировать, версионировать вместе с остальным кодом. Не сработает, если данные меняются в обход приложения.