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