I am trying to create a trigger which fires when a new row is inserted into my StudentInformation
table without the Email
field specified. The trigger should fire and update the email field with following pattern:
firstName.lastName@disney.com(e.g. Erik Kellener would be Erik.Kellener@disney.com)
If the insert statement already contains an email address, the trigger does not update the Email field. (e.g ignores the trigger’s action)
So something like this:
create trigger trg_assignEmail on StudentInformation for insert as begin if (email is null ) then update email set email = (pattern) ....
Can someone please help?
Advertisement
Answer
In SQL Server, you would typically do this with an instead of insert
trigger.
The idea is to select
the values that were given for insert
from pseudo-table inserted
, and then apply the business rule on the email
column.
Note that this requires listing all columns for insert. Assuming that you have firstName
, lastName
and email
, that would be:
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
An alternative is to use an after insert
trigger that update
s the last inserted row(s) whose email
is null
. This is less efficient (since you need to scan the table for the modified row(s)), but saves you from listing all columns. For this, we need a primary key – let me assume 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