Рассмотрим этот сценарий: у меня есть таблица Person
, которая имеет ссылку на таблицу Address
как отношение один-ко-многим (здесь для краткости опущены ограничения):
CREATE TABLE Person (
Id UNIQUEIDENTIFIER NOT NULL,
AddressId UNIQUEIDENTIFIER NULL
)
CREATE TABLE Address (
Id UNIQUEIDENTIFIER NOT NULL,
Street NVARCHAR(100) NULL,
City NVARCHAR(100) NULL,
ZipCode NVARCHAR(20) NULL
)
Теперь, если запись вставлена в таблицу Person
, я хотел бы автоматически создать пустую запись в таблице Address
(если столбец AddressId
равен NULL
) и связать эту новую Address
к новой Person
записи. Другими словами, я хочу создать запись в таблице Address
и обновить Person.AddressId
для каждого вставленного Person
без Address
.
Поскольку я обращаюсь к базе данных из разных приложений, используя разные ORM и разные бизнес-классы, я не хочу добавлять эту функциональность в бизнес-классы (несколько раз), а скорее в триггер БД в таблице Person
.
- Хорошая ли это практика в триггере БД?
- Какова лучшая реализация триггера («лучший» означает хороший компромисс между производительностью и удобочитаемостью)?
Я мог бы реализовать триггер, используя цикл WHILE
, повторяющийся по всем записям в inserted
и затем добавляя запись для каждого из вставленных Person
s - если им еще не назначено Address
. Однако это не похоже на правильный подход, если в массовой операции создается много записей Person
(например, при большом импорте). Можно ли выполнить это в одном операторе SQL с лучшей производительностью?