TR_GROUPMEMBERDATERANGE_UPDATE_HOUSEHOLD_UPDATE
Definition
Copy
CREATE trigger [dbo].[TR_GROUPMEMBERDATERANGE_UPDATE_HOUSEHOLD_UPDATE] on [dbo].[GROUPMEMBERDATERANGE] after update not for replication
as
begin
set nocount on;
declare @CHANGEAGENTID uniqueidentifier;
declare @CURRENTDATE datetime = getdate();
declare @CURRENTDATEEARLIESTTIME date = @CURRENTDATE;
-- For audit reasons:
-- Use the same ChangeAgentId used to update the groupmemberdaterange 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;
-- Find groups which the updated constituents are members of
declare @GROUPS table(GROUPID uniqueidentifier, HASPRIMARYCONTACT bit);
insert into @GROUPS(GROUPID, HASPRIMARYCONTACT)
select
[GROUPMEMBER].[GROUPID],
0
from
dbo.[GROUPMEMBER]
inner join inserted on inserted.GROUPMEMBERID = [GROUPMEMBER].ID
group by
[GROUPMEMBER].[GROUPID]
-- determine which groups have active primary members
update @GROUPS
set
HASPRIMARYCONTACT = 1
from
@GROUPS [GROUPS]
inner join dbo.[GROUPMEMBER] on [GROUPMEMBER].[GROUPID] = [GROUPS].[GROUPID]
inner join dbo.[GROUPMEMBERDATERANGE] on [GROUPMEMBER].[ID] = [GROUPMEMBERDATERANGE].[GROUPMEMBERID]
where
[GROUPMEMBER].[ISPRIMARY] = 1
and ([GROUPMEMBERDATERANGE].[DATETO] is null or ([GROUPMEMBERDATERANGE].[DATETO] is not null and [GROUPMEMBERDATERANGE].[DATETO] > @CURRENTDATE))
-- if a group does not have an active primary member, set the current inactive primary member to non-primary
update dbo.[GROUPMEMBER]
set
[GROUPMEMBER].[ISPRIMARY] = 0,
[GROUPMEMBER].[DATECHANGED] = @CURRENTDATE,
[GROUPMEMBER].[CHANGEDBYID] = isnull(@CHANGEAGENTID, [GROUPMEMBER].CHANGEDBYID)
from
@GROUPS [GROUPS]
inner join dbo.[GROUPMEMBER] on [GROUPS].[GROUPID] = [GROUPMEMBER].[GROUPID]
inner join dbo.[GROUPMEMBERDATERANGE] on [GROUPMEMBER].[ID] = [GROUPMEMBERDATERANGE].[GROUPMEMBERID]
where
[GROUPMEMBER].[ISPRIMARY] = 1
and [GROUPMEMBERDATERANGE].[DATETO] is not null and [GROUPMEMBERDATERANGE].[DATETO] <= @CURRENTDATE
-- if a group does not have an active primary member, set the oldest (by DATEADDED) current member as primary
update dbo.[GROUPMEMBER]
set
[GROUPMEMBER].[ISPRIMARY] = 1,
[GROUPMEMBER].[DATECHANGED] = @CURRENTDATE,
-- if change agent was not supplied for an inserted record, use the one retrieved from USP_CHANGEAGENT_GETORCREATECHANGEAGENT
-- if a change agent was supplied for an inserted record, and a group member corresponding to that record is being updated, use the supplied change agent
-- if there is a change agent specified but not for this group member, use a change agent from one of the inserted records in the same group
[GROUPMEMBER].[CHANGEDBYID] = coalesce(@CHANGEAGENTID, inserted.CHANGEDBYID, (
select top 1
inserted.[CHANGEDBYID]
from
inserted
inner join dbo.[GROUPMEMBER] [IGO] on [IGO].[ID] = inserted.[GROUPMEMBERID]
where
[IGO].[GROUPID] = [GROUPMEMBER].[GROUPID]
order by
inserted.[GROUPMEMBERID]
))
from
dbo.[GROUPMEMBER]
-- get the most senior current record
inner join (
select
[GM].[ID],
[GM].[ISPRIMARY],
[ROWNUM] = row_number() over(partition by [GM].[GROUPID] order by [GM].[ISPRIMARY] desc, [GM].[DATEADDED] asc)
from
@GROUPS [GROUPS]
inner join dbo.[GROUPMEMBER] [GM] on [GM].[GROUPID] = [GROUPS].[GROUPID]
inner join dbo.[GROUPMEMBERDATERANGE] [GMDR] on [GMDR].[GROUPMEMBERID] = [GM].[ID]
where
(([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))
) [V1] on [GROUPMEMBER].[ID] = [V1].[ID] and [V1].[ROWNUM] = 1 and [V1].[ISPRIMARY] = 0
left join inserted on [GROUPMEMBER].[ID] = inserted.[GROUPMEMBERID]
-- update the constituent current household table with households that are active
-- (i.e. today's date falls within the date range)
update dbo.[CONSTITUENTHOUSEHOLD] set
[HOUSEHOLDID] = [GROUPMEMBER].[GROUPID],
[ISPRIMARYMEMBER] = [GROUPMEMBER].[ISPRIMARY]
from
dbo.[GROUPMEMBER]
inner join dbo.[GROUPDATA] on [GROUPDATA].[ID] = [GROUPMEMBER].[GROUPID]
inner join dbo.[CONSTITUENTHOUSEHOLD] on [CONSTITUENTHOUSEHOLD].[ID] = [GROUPMEMBER].[MEMBERID]
left outer join dbo.[GROUPMEMBERDATERANGE] as [GMDR] on [GMDR].[GROUPMEMBERID] = [GROUPMEMBER].[ID]
where
(([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))
and [GROUPDATA].[GROUPTYPECODE] = 0
and exists(
select [ID]
from inserted
where
[GROUPMEMBER].[ID] = inserted.[GROUPMEMBERID]
);
-- update the constituent current household table for households that are dissolved / not active
-- (i.e. today's date falls outside of the date range)
update dbo.[CONSTITUENTHOUSEHOLD] set
[HOUSEHOLDID] = null,
[ISPRIMARYMEMBER] = 0
from
dbo.[GROUPMEMBER]
inner join dbo.[GROUPDATA] on [GROUPDATA].[ID] = [GROUPMEMBER].[GROUPID]
inner join dbo.[CONSTITUENTHOUSEHOLD] on [CONSTITUENTHOUSEHOLD].[ID] = [GROUPMEMBER].[MEMBERID]
left outer join dbo.[GROUPMEMBERDATERANGE] as [GMDR] on [GMDR].[GROUPMEMBERID] = [GROUPMEMBER].[ID]
where
(([GMDR].[DATEFROM] is not null and [GMDR].[DATEFROM] > @CURRENTDATEEARLIESTTIME)
or ([GMDR].[DATETO] is not null and [GMDR].[DATETO] <= @CURRENTDATEEARLIESTTIME))
and [GROUPDATA].[GROUPTYPECODE] = 0
and exists(
select [ID]
from inserted
where
[GROUPMEMBER].[ID] = inserted.[GROUPMEMBERID]
);
end