USP_DATAFORMTEMPLATE_EDIT_QUERYVIEW_PERMISSIONS

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN
@CHANGEAGENTID uniqueidentifier IN
@SYSTEMROLELIST xml IN

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_QUERYVIEW_PERMISSIONS
(
  @ID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null,
  @SYSTEMROLELIST xml
)
as begin
  set nocount on;

  declare @CONTEXTCACHE varbinary(128);

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

  /* cache current context information */
  set @CONTEXTCACHE = CONTEXT_INFO();

  /* set CONTEXT_INFO to @CHANGEAGENTID */
  if not @CHANGEAGENTID is null
    set CONTEXT_INFO @CHANGEAGENTID

  begin try
    -- build a temporary table containing the values from the XML, excluding ones where permission is None
    -- not using UFN_QUERYVIEW_GETSYSTEMROLEPERMISSIONSLIST_FROMITEMLISTXML since we need 
    -- GRANTORDENY to be deserialized as a tinyint (because it could be set to 2, which indicates None)
    declare @TEMP table (ID uniqueidentifier, SYSTEMROLEID uniqueidentifier, GRANTORDENY bit)
    insert into @TEMP 
    select
      T.c.value('(ID)[1]','uniqueidentifier') as ID,
      T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') as SYSTEMROLEID,
      T.c.value('(GRANTORDENY)[1]','bit') as GRANTORDENY
    from @SYSTEMROLELIST.nodes('/SYSTEMROLELIST/ITEM') T(c)
    where 
      T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1);

    -- rebuild the system role list
    set @SYSTEMROLELIST =
      (select ID, SYSTEMROLEID, GRANTORDENY
       from @TEMP
       for xml raw('ITEM'), type, elements, root('SYSTEMROLELIST'), binary base64);

    if @SYSTEMROLELIST is null
      delete from dbo.SYSTEMROLEPERM_QUERYVIEW where QUERYVIEWCATALOGID = @ID;
    else
      exec dbo.USP_QUERYVIEW_GETSYSTEMROLEPERMISSIONSLIST_UPDATEFROMXML @ID, @SYSTEMROLELIST, @CHANGEAGENTID;

    /* reset CONTEXT_INFO to previous value */
    if not @CONTEXTCACHE is null
      set CONTEXT_INFO @CONTEXTCACHE
  end try

  begin catch
    exec dbo.USP_RAISE_ERROR;
    return 1;
  end catch

  return 0;
end