Как автоматически создать и связать запись в таблице B после вставки в таблицу A - PullRequest
0 голосов
/ 17 июня 2019

Рассмотрим этот сценарий: у меня есть таблица 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.

  1. Хорошая ли это практика в триггере БД?
  2. Какова лучшая реализация триггера («лучший» означает хороший компромисс между производительностью и удобочитаемостью)?

Я мог бы реализовать триггер, используя цикл WHILE, повторяющийся по всем записям в inserted и затем добавляя запись для каждого из вставленных Person s - если им еще не назначено Address. Однако это не похоже на правильный подход, если в массовой операции создается много записей Person (например, при большом импорте). Можно ли выполнить это в одном операторе SQL с лучшей производительностью?

1 Ответ

0 голосов
/ 17 июня 2019

Вы можете попробовать использовать триггер после вставки:

CREATE TRIGGER personInsTrigger ON Person AFTER INSERT
AS 
BEGIN
    INSERT INTO Address (Id, Street, City, ZipCode)
    SELECT AddressId, NULL, NULL, NULL
    FROM INSERTED
END

Я бы также рекомендовал вам установить правильные ограничения внешнего / первичного ключа между двумя таблицами. Address.Id будет первичным ключом, а Person.AddressId будет внешним ключом.

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