TR_GROUPMEMBER_INSERT_HOUSEHOLD_UPDATE
Definition
Copy
CREATE trigger [dbo].[TR_GROUPMEMBER_INSERT_HOUSEHOLD_UPDATE] on [dbo].[GROUPMEMBER] after insert, update not for replication
as
begin
set nocount on;
declare @CURRENTDATE datetime = getdate();
declare @CURRENTDATEEARLIESTTIME date = @CURRENTDATE;
if update([ISPRIMARY])
begin
declare @CHANGEAGENTID uniqueidentifier;
-- For audit reasons:
-- Use the same ChangeAgentId used to update the groupmember row if it was updated.
-- If null, the set will simply coalesce out and effectively do nothing
-- Since this trigger may be hit by a bulk update, we can not assume that all ChangeByIds are the same for all records unless they aren't being specified.
if update([CHANGEDBYID])
set @CHANGEAGENTID = null;
else
exec dbo.[USP_CHANGEAGENT_GETORCREATECHANGEAGENT] @CHANGEAGENTID output;
declare @FALLBACKHOUSEHOLDNAMEFORMATID uniqueidentifier
select @FALLBACKHOUSEHOLDNAMEFORMATID = ID
from dbo.NAMEFORMATFUNCTION
where FORMATSQLFUNCTION = 'UFN_NAMEFORMAT_32';
update dbo.[CONSTITUENT]
set
[KEYNAME] =
-- Determine whether or not to use name function or fallback function
case coalesce(left(dbo.[UFN_NAMEFORMAT_FROMID]([GROUPDATA].[NAMEFORMATFUNCTIONID], [GROUPMEMBER].[MEMBERID]), 100),'')
when '' then left(dbo.[UFN_NAMEFORMAT_FROMID](@FALLBACKHOUSEHOLDNAMEFORMATID, [GROUPMEMBER].[MEMBERID]), 100)
else left(dbo.[UFN_NAMEFORMAT_FROMID]([GROUPDATA].[NAMEFORMATFUNCTIONID], [GROUPMEMBER].[MEMBERID]), 100)
end,
[DATECHANGED] = @CURRENTDATE,
[CHANGEDBYID] = isnull(@CHANGEAGENTID, inserted.[CHANGEDBYID])
from inserted
inner join dbo.[GROUPDATA] on inserted.[GROUPID] = [GROUPDATA].[ID]
inner join dbo.[GROUPMEMBER] on inserted.[GROUPID] = [GROUPMEMBER].[GROUPID]
where
[CONSTITUENT].[ID] = inserted.[GROUPID] and
[GROUPDATA].[NAMEFORMATFUNCTIONID] is not null and
[GROUPMEMBER].[ISPRIMARY] <> 0;
end
-- insert new members into the constituent current household table
insert into dbo.[CONSTITUENTHOUSEHOLD] ([ID], [HOUSEHOLDID], [ISPRIMARYMEMBER])
select
inserted.[MEMBERID],
inserted.[GROUPID],
inserted.[ISPRIMARY]
from inserted
inner join dbo.[GROUPDATA] on [GROUPDATA].[ID] = inserted.[GROUPID]
left outer join dbo.[GROUPMEMBERDATERANGE] as [GMDR] on [GMDR].[GROUPMEMBERID] = inserted.[ID]
where [GROUPDATA].[GROUPTYPECODE] = 0
and not exists (select 1 from dbo.[CONSTITUENTHOUSEHOLD] where [ID] = inserted.[MEMBERID])
and (([GMDR].[DATEFROM] is null and ([GMDR].[DATETO] is null or [GMDR].[DATETO] > @CURRENTDATEEARLIESTTIME))
or ([GMDR].[DATETO] is null and ([GMDR].[DATEFROM] is null or [GMDR].[DATEFROM] <= @CURRENTDATEEARLIESTTIME))
or ([GMDR].[DATEFROM] <= @CURRENTDATEEARLIESTTIME and [GMDR].[DATETO] > @CURRENTDATEEARLIESTTIME));
-- update the constituent current household table with information about households that are active
-- (i.e. today's date falls within the date range)
update dbo.[CONSTITUENTHOUSEHOLD] set
[HOUSEHOLDID] = inserted.[GROUPID],
[ISPRIMARYMEMBER] = inserted.[ISPRIMARY]
from inserted
inner join dbo.[GROUPDATA] on [GROUPDATA].[ID] = inserted.[GROUPID]
left outer join dbo.[GROUPMEMBERDATERANGE] as [GMDR] on [GMDR].[GROUPMEMBERID] = inserted.[ID]
inner join dbo.[CONSTITUENTHOUSEHOLD] on [CONSTITUENTHOUSEHOLD].[ID] = inserted.[MEMBERID]
where [GROUPDATA].[GROUPTYPECODE] = 0
and (([GMDR].[DATEFROM] is null and ([GMDR].[DATETO] is null or [GMDR].[DATETO] > @CURRENTDATEEARLIESTTIME))
or ([GMDR].[DATETO] is null and ([GMDR].[DATEFROM] is null or [GMDR].[DATEFROM] <= @CURRENTDATEEARLIESTTIME))
or ([GMDR].[DATEFROM] <= @CURRENTDATEEARLIESTTIME and [GMDR].[DATETO] > @CURRENTDATEEARLIESTTIME));
end