USP_DATAFORMTEMPLATE_EDIT_ADHOCQUERYFOLDERPERMISSIONS

The save procedure used by the edit dataform template "Ad-Hoc Query Folder Permissions Edit Form".

Parameters

Parameter Parameter Type Mode Description
@ID uniqueidentifier IN The input ID parameter indicating the ID of the record being edited.
@CHANGEAGENTID uniqueidentifier IN Input parameter indicating the ID of the change agent invoking the procedure.
@APPLYASDEFAULTPERMISSIONSFORALLSUBFOLDERS bit IN Apply the following as default permissions to all subfolders
@SECURITYLEVEL tinyint IN This folder is available to
@SYSTEMROLELIST xml IN System role list
@QUERYDEFAULTALLOWALLUSERSTORUN bit IN Allow all users to run this query
@QUERYDEFAULTALLOWALLUSERSTOEDIT bit IN Allow all users to edit this query
@APPLYQUERYDEFAULTSTOEXISTINGQUERIES bit IN Apply default query permissions to existing queries
@QUERYDEFAULTRUNROLES xml IN Query default run roles
@QUERYDEFAULTEDITROLES xml IN Query default edit roles
@SMARTQUERYDEFAULTALLOWALLUSERSTORUN bit IN Allow all users to run this query
@SMARTQUERYDEFAULTALLOWALLUSERSTOEDIT bit IN Allow other users to modify this query
@SMARTQUERYDEFAULTRUNROLES xml IN Smart Query default run roles

Definition

Copy

CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_ADHOCQUERYFOLDERPERMISSIONS
(
  @ID uniqueidentifier,
  @CHANGEAGENTID uniqueidentifier = null,
  @APPLYASDEFAULTPERMISSIONSFORALLSUBFOLDERS bit,
  @SECURITYLEVEL tinyint,
  @SYSTEMROLELIST xml,
  @QUERYDEFAULTALLOWALLUSERSTORUN bit,
  @QUERYDEFAULTALLOWALLUSERSTOEDIT bit,
  @APPLYQUERYDEFAULTSTOEXISTINGQUERIES bit,
  @QUERYDEFAULTRUNROLES xml,
  @QUERYDEFAULTEDITROLES xml,
  @SMARTQUERYDEFAULTALLOWALLUSERSTORUN bit,
  @SMARTQUERYDEFAULTALLOWALLUSERSTOEDIT bit,
  @SMARTQUERYDEFAULTRUNROLES xml
)
as

  set nocount on;

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

  declare @CURRENTDATE datetime
  set @CURRENTDATE = getdate()

  declare @FOLDERSTOUPDATE table
  (
    FOLDERID uniqueidentifier
  )

  insert into @FOLDERSTOUPDATE (FOLDERID) values (@ID)

  if @APPLYASDEFAULTPERMISSIONSFORALLSUBFOLDERS = 1
  begin
    -- Build the list of subfolders
    with RECURSIVECTE as
    (
      select
        ID, 
        PARENTFOLDERID
      from dbo.ADHOCQUERYFOLDER
      where
        PARENTFOLDERID = @ID

      union all

      select
        ADHOCQUERYFOLDER.ID,
        ADHOCQUERYFOLDER.PARENTFOLDERID
      from dbo.ADHOCQUERYFOLDER
      inner join RECURSIVECTE on ADHOCQUERYFOLDER.PARENTFOLDERID = RECURSIVECTE.ID
    )
    insert into @FOLDERSTOUPDATE (FOLDERID)
    select ID
    from RECURSIVECTE
    where ID <> @ID
  end

  begin try
    update dbo.ADHOCQUERYFOLDER set
      APPLYASDEFAULTPERMISSIONSFORALLSUBFOLDERS = @APPLYASDEFAULTPERMISSIONSFORALLSUBFOLDERS,
      CHANGEDBYID = @CHANGEAGENTID,
      DATECHANGED = @CURRENTDATE
    where ID = @ID

    update dbo.ADHOCQUERYFOLDER set
      SECURITYLEVELCODE = @SECURITYLEVEL,
      QUERYDEFAULTALLOWALLUSERSTORUN = @QUERYDEFAULTALLOWALLUSERSTORUN,
      QUERYDEFAULTALLOWALLUSERSTOEDIT = @QUERYDEFAULTALLOWALLUSERSTOEDIT,
      CHANGEDBYID = @CHANGEAGENTID,
      DATECHANGED = @CURRENTDATE,
      SMARTQUERYDEFAULTALLOWALLUSERSTORUN = @SMARTQUERYDEFAULTALLOWALLUSERSTORUN,
      SMARTQUERYDEFAULTALLOWALLUSERSTOEDIT = @SMARTQUERYDEFAULTALLOWALLUSERSTOEDIT
    where ID in (select FOLDERID from @FOLDERSTOUPDATE)

    declare @contextCache varbinary(128);
    set @contextCache = CONTEXT_INFO();
    set CONTEXT_INFO @CHANGEAGENTID;

    -- Always clear the folder permissions.  Even though the folders
    -- may be re-inserted for Selected Roles, we can't do updates
    -- since we may be updating multiple folders and so the IDs won't
    -- be relevant.
    delete from dbo.SYSTEMROLEPERM_ADHOCQUERYFOLDER
    where ADHOCQUERYFOLDERID in (select FOLDERID from @FOLDERSTOUPDATE)

    if @SECURITYLEVEL = 1 -- Selected roles
    begin
      insert into dbo.SYSTEMROLEPERM_ADHOCQUERYFOLDER
      (
        ADHOCQUERYFOLDERID,
        SYSTEMROLEID,
        GRANTORDENY,
        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
      )
      select
        FOLDERSTOUPDATE.FOLDERID,
        T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
        T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
      from @SYSTEMROLELIST.nodes('/SYSTEMROLELIST/ITEM') T(c)
      cross join @FOLDERSTOUPDATE FOLDERSTOUPDATE
      where 
        T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)
    end


    delete from dbo.ADHOCQUERYFOLDERDEFAULTQUERYROLE
    where ADHOCQUERYFOLDERID in (select FOLDERID from @FOLDERSTOUPDATE)

    if @QUERYDEFAULTALLOWALLUSERSTORUN = 0
      insert into dbo.ADHOCQUERYFOLDERDEFAULTQUERYROLE
      (
        ADHOCQUERYFOLDERID,
        SYSTEMROLEID,
        GRANTORDENY,
        PERMISSIONTYPECODE,
        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
      )
      select
        FOLDERSTOUPDATE.FOLDERID,
        T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
        T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
        0, -- Run
        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
      from @QUERYDEFAULTRUNROLES.nodes('/QUERYDEFAULTRUNROLES/ITEM') T(c)
      cross join @FOLDERSTOUPDATE FOLDERSTOUPDATE
      where 
        T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)

    if @QUERYDEFAULTALLOWALLUSERSTOEDIT = 0
      insert into dbo.ADHOCQUERYFOLDERDEFAULTQUERYROLE
      (
        ADHOCQUERYFOLDERID,
        SYSTEMROLEID,
        GRANTORDENY,
        PERMISSIONTYPECODE,
        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
      )
      select
        FOLDERSTOUPDATE.FOLDERID,
        T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
        T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
        1, -- Edit
        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
      from @QUERYDEFAULTEDITROLES.nodes('/QUERYDEFAULTEDITROLES/ITEM') T(c)
      cross join @FOLDERSTOUPDATE FOLDERSTOUPDATE
      where 
        T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)

    if @SMARTQUERYDEFAULTALLOWALLUSERSTORUN = 0
      insert into dbo.ADHOCQUERYFOLDERDEFAULTQUERYROLE
      (
        ADHOCQUERYFOLDERID,
        SYSTEMROLEID,
        GRANTORDENY,
        PERMISSIONTYPECODE,
        ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
      )
      select
        FOLDERSTOUPDATE.FOLDERID,
        T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
        T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
        2, -- RunSmartQuery
        @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
      from @SMARTQUERYDEFAULTRUNROLES.nodes('/SMARTQUERYDEFAULTRUNROLES/ITEM') T(c)
      cross join @FOLDERSTOUPDATE FOLDERSTOUPDATE
      where 
        T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)

    if @APPLYQUERYDEFAULTSTOEXISTINGQUERIES = 1
    begin
      update dbo.ADHOCQUERY set
        SECURITYLEVEL = case @QUERYDEFAULTALLOWALLUSERSTORUN 
                  when 1 then 0 -- All roles
                  else 1 -- Selected roles
                end,
        SECURITYLEVELEDIT = case @QUERYDEFAULTALLOWALLUSERSTOEDIT
                    when 1 then 0 -- All roles
                    else 1 -- Selected roles
                  end,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where
        FOLDERID in (select FOLDERID from @FOLDERSTOUPDATE)

      update dbo.SMARTQUERYINSTANCE set
        SECURITYLEVEL = case @SMARTQUERYDEFAULTALLOWALLUSERSTORUN 
                  when 1 then 0 -- All roles
                  else 1 -- Selected roles
                end,
        OTHERSCANMODIFY = case @SMARTQUERYDEFAULTALLOWALLUSERSTOEDIT
                    when 1 then 1 -- Currently just a boolean, but allow for specifying specific roles in the future.
                    else 0
                  end,
        CHANGEDBYID = @CHANGEAGENTID,
        DATECHANGED = @CURRENTDATE
      where
        FOLDERID in (select FOLDERID from @FOLDERSTOUPDATE)

      -- Update query run permissions
      delete from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCE
      where ADHOCQUERYID in 
        (
          select ADHOCQUERY.ID 
          from dbo.ADHOCQUERY
          inner join @FOLDERSTOUPDATE FOLDERSTOUPDATE on ADHOCQUERY.FOLDERID = FOLDERSTOUPDATE.FOLDERID)

      if @QUERYDEFAULTALLOWALLUSERSTORUN = 0
        insert into dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCE
        (
          ADHOCQUERYID,
          SYSTEMROLEID,
          GRANTORDENY,
          ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
        )
        select
          INCLUDEDQUERY.ID,
          T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
          T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
          @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
        from @QUERYDEFAULTRUNROLES.nodes('/QUERYDEFAULTRUNROLES/ITEM') T(c)
        cross join
        (
          select ADHOCQUERY.ID 
          from dbo.ADHOCQUERY
          inner join @FOLDERSTOUPDATE FOLDERSTOUPDATE on ADHOCQUERY.FOLDERID = FOLDERSTOUPDATE.FOLDERID
        ) as INCLUDEDQUERY
        where 
          T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)

      -- Update query edit permissions
      delete from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCEEDIT
      where ADHOCQUERYID in 
        (
          select ADHOCQUERY.ID 
          from dbo.ADHOCQUERY
          inner join @FOLDERSTOUPDATE FOLDERSTOUPDATE on ADHOCQUERY.FOLDERID = FOLDERSTOUPDATE.FOLDERID)

      if @QUERYDEFAULTALLOWALLUSERSTOEDIT = 0
        insert into dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCEEDIT
        (
          ADHOCQUERYID,
          SYSTEMROLEID,
          GRANTORDENY,
          ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
        )
        select
          INCLUDEDQUERY.ID,
          T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
          T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
          @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
        from @QUERYDEFAULTEDITROLES.nodes('/QUERYDEFAULTEDITROLES/ITEM') T(c)
        cross join
        (
          select ADHOCQUERY.ID 
          from dbo.ADHOCQUERY
          inner join @FOLDERSTOUPDATE FOLDERSTOUPDATE on ADHOCQUERY.FOLDERID = FOLDERSTOUPDATE.FOLDERID
        ) as INCLUDEDQUERY
        where 
          T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)

      -- Update smart query instance run permissions
      delete from dbo.SYSTEMROLEPERM_SMARTQUERYINSTANCE
      where SMARTQUERYID in 
        (
          select SMARTQUERYINSTANCE.ID 
          from dbo.SMARTQUERYINSTANCE
          inner join @FOLDERSTOUPDATE FOLDERSTOUPDATE on SMARTQUERYINSTANCE.FOLDERID = FOLDERSTOUPDATE.FOLDERID)

      if @SMARTQUERYDEFAULTALLOWALLUSERSTORUN = 0
        insert into dbo.SYSTEMROLEPERM_SMARTQUERYINSTANCE
        (
          SMARTQUERYID,
          SYSTEMROLEID,
          GRANTORDENY,
          ADDEDBYID, CHANGEDBYID, DATEADDED, DATECHANGED
        )
        select
          INCLUDEDQUERY.ID,
          T.c.value('(SYSTEMROLEID)[1]','uniqueidentifier') AS 'SYSTEMROLEID',
          T.c.value('(GRANTORDENY)[1]','bit') AS 'GRANTORDENY',
          @CHANGEAGENTID, @CHANGEAGENTID, @CURRENTDATE, @CURRENTDATE
        from @SMARTQUERYDEFAULTRUNROLES.nodes('/SMARTQUERYDEFAULTRUNROLES/ITEM') T(c)
        cross join
        (
          select SMARTQUERYINSTANCE.ID 
          from dbo.SMARTQUERYINSTANCE
          inner join @FOLDERSTOUPDATE FOLDERSTOUPDATE on SMARTQUERYINSTANCE.FOLDERID = FOLDERSTOUPDATE.FOLDERID
        ) as INCLUDEDQUERY
        where 
          T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)
    end

    if not @contextCache is null
      set CONTEXT_INFO @contextCache;
  end try
  begin catch
    exec dbo.USP_RAISE_ERROR
    return 1
  end catch

return 0;