![]() |
---|
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; declare @GROUPID uniqueidentifier declare @HASPRIMARYCONTACT integer select @GROUPID = GROUPID from dbo.[GROUPMEMBER] left join inserted on inserted.GROUPMEMBERID = [GROUPMEMBER].ID where [GROUPMEMBER].ID = inserted.GROUPMEMBERID --check to make sure there is a non-expired primary contact. select @HASPRIMARYCONTACT = count([GROUPMEMBER].ID) from dbo.[GROUPMEMBER] inner join dbo.[GROUPMEMBERDATERANGE] on [GROUPMEMBER].ID = [GROUPMEMBERDATERANGE].GROUPMEMBERID where [GROUPMEMBER].GROUPID = @GROUPID and [GROUPMEMBER].ISPRIMARY = 1 and (DATETO is null or (DATETO is not null and DATETO > GETDATE())) -- If the groups that the updated entries belong to do not have a primary member, make the oldest entry in the group the primary -- We will only update those groups whose membership is being altered. if @HASPRIMARYCONTACT = 0 begin --set isprimary = 0 for all expired members update dbo.[GROUPMEMBER] set [ISPRIMARY] = 0, [DATECHANGED] = @CURRENTDATE, [CHANGEDBYID] = isnull(@CHANGEAGENTID, [GROUPMEMBER].CHANGEDBYID) from dbo.[GROUPMEMBER] left join dbo.[GROUPMEMBERDATERANGE] on [GROUPMEMBER].ID = [GROUPMEMBERDATERANGE].GROUPMEMBERID where [GROUPMEMBER].GROUPID = @GROUPID and [GROUPMEMBER].ISPRIMARY = 1 and DATETO is not null and DATETO < GETDATE() update dbo.[GROUPMEMBER] set [ISPRIMARY] = 1, [DATECHANGED] = @CURRENTDATE, [CHANGEDBYID] = isnull(@CHANGEAGENTID, [V1].[CHANGEDBYID]) from dbo.[GROUPMEMBER] inner join ( select [GM].[ID], [GM].[ISPRIMARY], inserted.[CHANGEDBYID], row_number() over(partition by [GM].[GROUPID] order by [GM].[ISPRIMARY] desc, [GM].[DATEADDED] asc) as [ROWNUM] from inserted inner join dbo.[GROUPMEMBER] as [PM] on inserted.[GROUPMEMBERID] = [PM].[ID] and [PM].[ISPRIMARY] = 0 inner join dbo.[GROUPMEMBER] as [GM] on [PM].[GROUPID] = [GM].[GROUPID] left join dbo.[GROUPMEMBERDATERANGE] as [GMDR] on [GM].[ID] = [GMDR].[GROUPMEMBERID] 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)) ) as [V1] on [GROUPMEMBER].[ID] = [V1].[ID] and [V1].[ROWNUM] = 1 and [V1].[ISPRIMARY] = 0; end --Update the constituent current household table... -- This should run each time in case a member exists in the CONSTITUENTHOUSEHOLD table and is added back. update dbo.[CONSTITUENTHOUSEHOLD] set [HOUSEHOLDID] = [GROUPMEMBER].[GROUPID] from dbo.[GROUPMEMBER] inner join dbo.[GROUPDATA] on [GROUPDATA].[ID] = [GROUPMEMBER].[GROUPID] inner join dbo.[CONSTITUENTHOUSEHOLD] on [CONSTITUENTHOUSEHOLD].[ID] = [GROUPMEMBER].[MEMBERID] left 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] ); if update([DATETO]) 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] inner join inserted on inserted.[GROUPMEMBERID] = [GROUPMEMBER].[ID] where inserted.[DATETO] is not null and [GROUPDATA].[GROUPTYPECODE] = 0; end |