USP_ROLESYNC_SYSTEMROLE_SYNCUSERS

Updates the list of assigned users for a role from an LDAP query or active directory search.

Parameters

Parameter Parameter Type Mode Description
@SYSTEMROLEID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@USERSIDLIST xml IN

Definition

Copy


            CREATE procedure dbo.USP_ROLESYNC_SYSTEMROLE_SYNCUSERS 
            (
                @SYSTEMROLEID uniqueidentifier, 
                @CHANGEAGENTID uniqueidentifier = null
                @USERSIDLIST xml
            )
            as
                --Used by the RoleSync utility

                set nocount on;

                if @CHANGEAGENTID is null  
                    exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

                declare @CURRENTDATE datetime;
                set @CURRENTDATE=getdate();

                begin try
                    update 
                        dbo.SYSTEMROLE 
                    set
                        CHANGEDBYID = @CHANGEAGENTID
                        DATECHANGED = @CURRENTDATE
                    where 
                        ID = @SYSTEMROLEID;

                    --Parse and validate user name list

                    declare @sids table (SYSTEMROLEAPPUSERID uniqueidentifier, sid varbinary(85), username nvarchar(255), groupid uniqueidentifier)

                    insert into @sids (SYSTEMROLEAPPUSERID, sid, username, groupid)
                        select 
                            isnull(
                                (select 
                                    SYSTEMROLEAPPUSER.ID 
                                from 
                                    dbo.SYSTEMROLEAPPUSER 
                                    inner join dbo.APPUSER on APPUSER.ID = SYSTEMROLEAPPUSER.APPUSERID 
                                where 
                                    APPUSER.USERSID = T.c.value('(USERSID)[1]','varbinary(85)') and 
                                    SYSTEMROLEAPPUSER.SYSTEMROLEID = @SYSTEMROLEID
                                ), 
                                newID()
                            ) as ID,
                            T.c.value('(USERSID)[1]','varbinary(85)') as USERSID,
                            T.c.value('(DISPLAYNAME)[1]','nvarchar(255)') as DISPLAYNAME,
                            T.c.value('(GROUPID)[1]','uniqueidentifier') as GROUPID
                        from 
                            @USERSIDLIST.nodes('/USERSIDLIST/ITEM') T(c);

                    --Add Appusers that don't yet exist

                    insert into dbo.APPUSER (USERSID, [ADDEDBYID], [CHANGEDBYID], [DATEADDED], [DATECHANGED], WINDOWSUSERNAME)
                        select distinct 
                            SID,
                            @CHANGEAGENTID,
                            @CHANGEAGENTID,
                            @CURRENTDATE,
                            @CURRENTDATE,
                            case when len(NEWUSERS.USERNAME) > 0 then NEWUSERS.USERNAME
                                else coalesce(suser_name(SID), '') end
                        from 
                            @sids as NEWUSERS
                        where 
                            NEWUSERS.SID not in (select USERSID from dbo.APPUSER);

                    declare @contextCache varbinary(128);

                    /* Cache current context information 
                    The Context Info will be used by delete triggers to log the AUDITCHANGEAGENTID 
                    as the supplied @CHANGEAGENTID rather than the default change agent id. */

                    set @contextCache = CONTEXT_INFO();

                    --Set CONTEXT_INFO to @CHANGEAGENTID

                    if not @CHANGEAGENTID is null
                        set CONTEXT_INFO @CHANGEAGENTID

                    --Remove users no longer in role

                    delete from 
                        dbo.SYSTEMROLEAPPUSER
                    where 
                        SYSTEMROLEID = @SYSTEMROLEID and 
                        FROMROLESYNC = 1 and
                        APPUSERID not in (select APPUSER.ID from @sids as SIDS inner join dbo.APPUSER on SIDS.sid = APPUSER.USERSID);

                    --Reset CONTEXT_INFO to previous value 

                    if not @contextCache is null
                        set CONTEXT_INFO @contextCache                    

                    --Cache the list of records with security updates

                    declare @SECURITYUPDATES table(SYSTEMROLEAPPUSERID uniqueidentifier, GROUPID uniqueidentifier, SECURITYMODECODE tinyint, BRANCHSITEID uniqueidentifier, CONSTITUENTSECURITYMODECODE tinyint);

                    insert into @SECURITYUPDATES(SYSTEMROLEAPPUSERID, GROUPID, SECURITYMODECODE, BRANCHSITEID, CONSTITUENTSECURITYMODECODE)
                        select
                            SIDS.SYSTEMROLEAPPUSERID,
                            SYSTEMROLEADGROUP.ID,
                            SYSTEMROLEADGROUP.SECURITYMODECODE,
                            SYSTEMROLEADGROUP.BRANCHSITEID,
                            SYSTEMROLEADGROUP.CONSTITUENTSECURITYMODECODE
                        from
                            dbo.APPUSER
                            inner join @sids as SIDS on SIDS.SID = APPUSER.USERSID
                            inner join dbo.SYSTEMROLEADGROUP on SYSTEMROLEADGROUP.ID = SIDS.GROUPID
                        where 
                            APPUSER.ID not in (select APPUSERID from dbo.SYSTEMROLEAPPUSER where SYSTEMROLEID = @SYSTEMROLEID) or
                            SYSTEMROLEADGROUP.OVERWRITEEXISTINGSECURITY = 1

                    --Add users to role

                    insert into dbo.SYSTEMROLEAPPUSER (ID, SYSTEMROLEID, APPUSERID, FROMROLESYNC, SECURITYMODECODE, BRANCHSITEID, CONSTITUENTSECURITYMODECODE, ADDEDBYID,CHANGEDBYID,DATEADDED,DATECHANGED)
                        select 
                            SIDS.SYSTEMROLEAPPUSERID,
                            @SYSTEMROLEID
                            APPUSER.ID, 
                            1
                            isnull((select SYSTEMROLEADGROUP.SECURITYMODECODE from dbo.SYSTEMROLEADGROUP WHERE SIDS.GROUPID = SYSTEMROLEADGROUP.ID),0),
                            (select SYSTEMROLEADGROUP.BRANCHSITEID from dbo.SYSTEMROLEADGROUP where SIDS.GROUPID = SYSTEMROLEADGROUP.ID),
                            isnull((select SYSTEMROLEADGROUP.CONSTITUENTSECURITYMODECODE from dbo.SYSTEMROLEADGROUP WHERE SIDS.GROUPID = SYSTEMROLEADGROUP.ID),0),
                            @CHANGEAGENTID
                            @CHANGEAGENTID
                            @CURRENTDATE
                            @CURRENTDATE
                        from 
                            dbo.APPUSER
                            inner join @sids as SIDS on SIDS.SID = APPUSER.USERSID
                        where 
                            APPUSER.ID not in (select APPUSERID from dbo.SYSTEMROLEAPPUSER where SYSTEMROLEID = @SYSTEMROLEID);

                    --Set site and constituent security on synchronized records

                    update 
                        dbo.SYSTEMROLEAPPUSER
                    set
                        SYSTEMROLEAPPUSER.SECURITYMODECODE = SECURITYUPDATES.SECURITYMODECODE,
                        SYSTEMROLEAPPUSER.BRANCHSITEID = SECURITYUPDATES.BRANCHSITEID,
                        SYSTEMROLEAPPUSER.CONSTITUENTSECURITYMODECODE = SECURITYUPDATES.CONSTITUENTSECURITYMODECODE,
                        FROMROLESYNC = 1
                    from
                        SYSTEMROLEAPPUSER
                        inner join @SECURITYUPDATES as SECURITYUPDATES on SECURITYUPDATES.SYSTEMROLEAPPUSERID = SYSTEMROLEAPPUSER.ID                        

                    /* Cache current context information 
                       The Context Info will be used by delete triggers to log the AUDITCHANGEAGENTID 
                       as the supplied @CHANGEAGENTID rather than the default change agent id. */
                    set @contextCache = CONTEXT_INFO();

                    --Set CONTEXT_INFO to @CHANGEAGENTID

                    if not @CHANGEAGENTID is null
                        set CONTEXT_INFO @CHANGEAGENTID

                    --Remove any existing site security.  This will be overwritten with site security defined on the group.

                    delete from 
                        dbo.SYSTEMROLEAPPUSERSITE
                    where 
                        SYSTEMROLEAPPUSERSITE.SYSTEMROLEAPPUSERID in (select SYSTEMROLEAPPUSERID from @SECURITYUPDATES);

                    --Remove any existing constituent security.  This will be overwritten with constituent security defined on the group.

                    delete from 
                        dbo.SYSTEMROLEAPPUSERCONSTITUENTSECURITY
                    where 
                        SYSTEMROLEAPPUSERCONSTITUENTSECURITY.SYSTEMROLEAPPUSERID in (select SYSTEMROLEAPPUSERID from @SECURITYUPDATES);

                    --Reset CONTEXT_INFO to previous value 

                    if not @contextCache is null
                        set CONTEXT_INFO @contextCache

                    --Insert site security

                    insert into dbo.SYSTEMROLEAPPUSERSITE (SYSTEMROLEAPPUSERID, SITEID, DATEADDED, DATECHANGED, ADDEDBYID, CHANGEDBYID)
                        select 
                            SECURITYUPDATES.SYSTEMROLEAPPUSERID, 
                            SYSTEMROLEADGROUPSITE.SITEID, 
                            @CURRENTDATE
                            @CURRENTDATE
                            @CHANGEAGENTID
                            @CHANGEAGENTID 
                        from 
                            @SECURITYUPDATES as SECURITYUPDATES 
                            inner join dbo.SYSTEMROLEADGROUPSITE on SYSTEMROLEADGROUPSITE.SYSTEMROLEADGROUPID = SECURITYUPDATES.GROUPID
                        where
                            SECURITYUPDATES.SECURITYMODECODE = 2;

                    --Insert constituent security

                    insert into dbo.SYSTEMROLEAPPUSERCONSTITUENTSECURITY(SYSTEMROLEAPPUSERID, CONSTITUENTSECURITYATTRIBUTEID, DATEADDED, DATECHANGED, ADDEDBYID, CHANGEDBYID)
                        select 
                            SECURITYUPDATES.SYSTEMROLEAPPUSERID, 
                            SYSTEMROLEADGROUPCONSTITUENTSECURITY.CONSTITUENTSECURITYATTRIBUTEID, 
                            @CURRENTDATE
                            @CURRENTDATE
                            @CHANGEAGENTID
                            @CHANGEAGENTID 
                        from 
                            @SECURITYUPDATES as SECURITYUPDATES 
                            inner join dbo.SYSTEMROLEADGROUPCONSTITUENTSECURITY on SYSTEMROLEADGROUPCONSTITUENTSECURITY.SYSTEMROLEADGROUPID = SECURITYUPDATES.GROUPID
                        where
                            SECURITYUPDATES.CONSTITUENTSECURITYMODECODE = 2

                    --Update display names for any Appusers that don't have them

                    update 
                        dbo.APPUSER 
                    set 
                        DISPLAYNAME = NEWUSERS.USERNAME, 
                        CHANGEDBYID = @CHANGEAGENTID
                        DATECHANGED = @CURRENTDATE
                    from 
                        dbo.APPUSER
                        inner join @sids as NEWUSERS on APPUSER.USERSID = NEWUSERS.SID
                    where 
                        len(APPUSER.DISPLAYNAME) = 0 and 
                        len(NEWUSERS.USERNAME) > 0;

                    return 0;

                END TRY
                BEGIN CATCH
                    exec dbo.USP_RAISE_ERROR;
                    return 1;
                END CATCH