Триггер для автоматического обновления поля электронной почты? - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь создать триггер, который срабатывает, когда в мою StudentInformation таблицу вставляется новая строка без указанного поля Email. Триггер должен сработать и обновить поле электронной почты следующим образом:

firstName.lastName@disney.com(e.g. Erik Kellener would be Erik.Kellener@disney.com)

Если оператор вставки уже содержит адрес электронной почты, триггер не обновляет поле электронной почты. (например, игнорирует действие триггера)

Примерно так:

create trigger trg_assignEmail

on StudentInformation
for insert
as begin
     if (email is null ) then
     update email 
     set email = (pattern)
....

Кто-нибудь может помочь?

1 Ответ

2 голосов
/ 26 мая 2020

На сервере SQL вы обычно делаете это с помощью триггера instead of insert.

Идея состоит в том, чтобы select значения, которые были заданы для insert из псевдотаблицы inserted, а затем применить бизнес-правило к столбцу email.

Примечание что для этого требуется перечислить все столбцы для вставки. Предполагая, что у вас есть firstName, lastName и email, это будет:

create trigger trgAssignEmail on StudentInformation
instead of insert
as
    set nocount on
    insert into StudentInformation(firstName, lastName, email)
    select 
        firstName,
        lastName,
        coalesce(email,  firstName + '.' + lastName + '@disney.com')
    from inserted

Альтернативой является использование after insert триггера, который update s последняя вставленная строка (s ), для которого email равно null. Это менее эффективно (поскольку вам нужно сканировать таблицу на предмет измененных строк), но избавляет вас от перечисления всех столбцов. Для этого нам понадобится первичный ключ - допустим, id:

create trigger trgAssignEmail on StudentInformation
after insert
as
    set nocount on
    update s
    set s.email  = s.firstName + '.' + s.lastName + '@disney.com'
    from StudentInformation s
    inner join inserted i on i.id = s.id
    where s.email is null
...