USP_DATAFORMTEMPLATE_EDIT_ADHOCQUERY_PERMISSIONS_2
The save procedure used by the edit dataform template "Edit Ad-hoc Query Instance Permissions".
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. |
@SECURITYLEVEL | tinyint | IN | This feature is available to |
@SYSTEMROLELIST | xml | IN | System Role List |
@SECURITYLEVELEDIT | tinyint | IN | This feature is available to |
@SYSTEMROLELISTEDIT | xml | IN | System Role List |
Definition
Copy
CREATE procedure dbo.USP_DATAFORMTEMPLATE_EDIT_ADHOCQUERY_PERMISSIONS_2
(
@ID uniqueidentifier,
@CHANGEAGENTID uniqueidentifier = null,
@SECURITYLEVEL tinyint,
@SYSTEMROLELIST xml,
@SECURITYLEVELEDIT tinyint,
@SYSTEMROLELISTEDIT xml
) AS
set nocount on;
if @CHANGEAGENTID is null
exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;
declare @CURRENTDATE datetime;
set @CURRENTDATE=getdate();
BEGIN TRY
declare @SYSTEMROLEID varchar(max)
declare @SYSTEMROLEEDITLIST varchar(max)
declare @SYSTEMROLEEDITLISTFORRUNTAB varchar(max)
declare @SYSTEMROLEEDITLISTMODIFIED xml
declare @SYSTEMROLEEDITLISTFORRUNTABMODIFIED xml
declare @GRANTORDENY varchar(max)
declare @XMLTOBESAVED as xml
if @SECURITYLEVEL = 1
begin
-- build a temporary table containing the values from the XML, excluding ones where permission is None
-- Not using UFN_ADHOCQUERYINSTANCE_GETSYSTEMROLEPERMISSIONSLIST_FROMITEMLISTXML since we need
-- GRANTORDENY to be deserialized as a tinyint since it could be set to 2 - which indicates None.
declare @TempTbl table (ID uniqueidentifier, SYSTEMROLEID uniqueidentifier, GRANTORDENY bit)
insert into @TempTbl
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 @TempTbl
for xml raw('ITEM'), type, elements, root('SYSTEMROLELIST'), BINARY BASE64)
if @SYSTEMROLELIST is null
delete from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCE where ADHOCQUERYID = @ID
else
exec dbo.USP_ADHOCQUERYINSTANCE_GETSYSTEMROLEPERMISSIONSLIST_UPDATEFROMXML @ID, @SYSTEMROLELIST, @CHANGEAGENTID;
declare SYSTEMROLESFORRUNTAB CURSOR FOR
select SYSTEMROLEID,
case when GRANTORDENY = 0 then 'false'
else 'true' end as GRANTORDENY from dbo.[SYSTEMROLEPERM_ADHOCQUERYINSTANCE] where ADHOCQUERYID = @ID;
open SYSTEMROLESFORRUNTAB
fetch next from SYSTEMROLESFORRUNTAB into @SYSTEMROLEID,@GRANTORDENY;
while ( @@FETCH_STATUS = 0)
begin
set @SYSTEMROLEEDITLISTFORRUNTAB = '<r SystemRoleID='''+ISNULL(@SYSTEMROLEID,'')+''' GrantOrDeny='''+@GRANTORDENY+''' />'+ISNULL(@SYSTEMROLEEDITLISTFORRUNTAB,'');
fetch next from SYSTEMROLESFORRUNTAB into @SYSTEMROLEID,@GRANTORDENY;
end
close SYSTEMROLESFORRUNTAB
deallocate SYSTEMROLESFORRUNTAB
set @XMLTOBESAVED = CONVERT(XML, @SYSTEMROLEEDITLISTFORRUNTAB);
select @SYSTEMROLEEDITLISTFORRUNTABMODIFIED = QUERYDEFINITIONXML from dbo.ADHOCQUERY where ID = @ID;
set @SYSTEMROLEEDITLISTFORRUNTABMODIFIED = CAST(REPLACE(CAST(@SYSTEMROLEEDITLISTFORRUNTABMODIFIED AS NVARCHAR(MAX)),' xmlns=""','') AS XML);
update dbo.ADHOCQUERY set QUERYDEFINITIONXML = @SYSTEMROLEEDITLISTFORRUNTABMODIFIED where ID = @ID;
;WITH XMLNAMESPACES ('Blackbaud.AppFx.WebService.API.1' as t)
update dbo.ADHOCQUERY set QUERYDEFINITIONXML.modify('
delete (/t:AdHocQuery/t:PermissionedRunRoles/t:r)
') where ID = @ID;
;WITH XMLNAMESPACES ('Blackbaud.AppFx.WebService.API.1' as t)
update dbo.ADHOCQUERY set QUERYDEFINITIONXML.modify('
insert sql:variable("@XMLTOBESAVED")
into (/t:AdHocQuery/t:PermissionedRunRoles)[1]
') where ID = @ID;
select @SYSTEMROLEEDITLISTFORRUNTABMODIFIED = QUERYDEFINITIONXML from dbo.ADHOCQUERY where ID = @ID;
set @SYSTEMROLEEDITLISTFORRUNTABMODIFIED = CAST(REPLACE(CAST(@SYSTEMROLEEDITLISTFORRUNTABMODIFIED AS NVARCHAR(MAX)),' xmlns=""','') AS XML);
update dbo.ADHOCQUERY set QUERYDEFINITIONXML = @SYSTEMROLEEDITLISTFORRUNTABMODIFIED where ID = @ID;
end
else
-- remove rows from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCE
delete from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCE where ADHOCQUERYID = @ID
if @SECURITYLEVELEDIT = 1
begin
-- build a temporary table containing the values from the XML, excluding ones where permission is None
-- Not using UFN_ADHOCQUERYINSTANCE_GETSYSTEMROLEPERMISSIONSLIST_FROMITEMLISTXML since we need
-- GRANTORDENY to be deserialized as a tinyint when verifying it's 0 or 1 since it could be set to 2 (which indicates None)
-- which then couldn't be converted.
declare @TempTblEdit table (ID uniqueidentifier, SYSTEMROLEID uniqueidentifier, GRANTORDENY bit)
insert into @TempTblEdit
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 @SYSTEMROLELISTEDIT.nodes('/SYSTEMROLELISTEDIT/ITEM') T(c)
where
T.c.value('(GRANTORDENY)[1]','tinyint') in (0, 1)
-- rebuild the system role list
-- need to change the element to 'SYSTEMROLELIST' since that's what USP_ADHOCQUERYINSTANCE_GETSYSTEMROLEEDITPERMISSIONSLIST_UPDATEFROMXML
-- expects
set @SYSTEMROLELISTEDIT =
(select ID, SYSTEMROLEID, GRANTORDENY
from @TempTblEdit
for xml raw('ITEM'), type, elements, root('SYSTEMROLELIST'), BINARY BASE64)
if @SYSTEMROLELISTEDIT is null
delete from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCEEDIT where ADHOCQUERYID = @ID
else
exec dbo.USP_ADHOCQUERYINSTANCE_GETSYSTEMROLEEDITPERMISSIONSLIST_UPDATEFROMXML @ID, @SYSTEMROLELISTEDIT, @CHANGEAGENTID;
declare SYSTEMROLES CURSOR FOR
select SYSTEMROLEID,
case when GRANTORDENY = 0 then 'false'
else 'true' end as GRANTORDENY from dbo.[SYSTEMROLEPERM_ADHOCQUERYINSTANCEEDIT] where ADHOCQUERYID = @ID;
open SYSTEMROLES
fetch next from SYSTEMROLES into @SYSTEMROLEID,@GRANTORDENY;
while ( @@FETCH_STATUS = 0)
begin
set @SYSTEMROLEEDITLIST = '<r SystemRoleID='''+ISNULL(@SYSTEMROLEID,'')+''' GrantOrDeny='''+@GRANTORDENY+''' />'+ISNULL(@SYSTEMROLEEDITLIST,'');
fetch next from SYSTEMROLES into @SYSTEMROLEID,@GRANTORDENY;
end
close SYSTEMROLES
deallocate SYSTEMROLES
set @XMLTOBESAVED = CONVERT(XML, @SYSTEMROLEEDITLIST);
select @SYSTEMROLEEDITLISTMODIFIED = QUERYDEFINITIONXML from dbo.ADHOCQUERY where ID = @ID;
set @SYSTEMROLEEDITLISTMODIFIED = CAST(REPLACE(CAST(@SYSTEMROLEEDITLISTMODIFIED AS NVARCHAR(MAX)),' xmlns=""','') AS XML);
update dbo.ADHOCQUERY set QUERYDEFINITIONXML = @SYSTEMROLEEDITLISTMODIFIED where ID = @ID;
;WITH XMLNAMESPACES ('Blackbaud.AppFx.WebService.API.1' as t)
update dbo.ADHOCQUERY set QUERYDEFINITIONXML.modify('
delete (/t:AdHocQuery/t:PermissionedEditRoles/t:r)
') where ID = @ID;
;WITH XMLNAMESPACES ('Blackbaud.AppFx.WebService.API.1' as t)
update dbo.ADHOCQUERY set QUERYDEFINITIONXML.modify('
insert sql:variable("@XMLTOBESAVED")
into (/t:AdHocQuery/t:PermissionedEditRoles)[1]
') where ID = @ID;
select @SYSTEMROLEEDITLISTMODIFIED = QUERYDEFINITIONXML from dbo.ADHOCQUERY where ID = @ID;
set @SYSTEMROLEEDITLISTMODIFIED = CAST(REPLACE(CAST(@SYSTEMROLEEDITLISTMODIFIED AS NVARCHAR(MAX)),' xmlns=""','') AS XML);
update dbo.ADHOCQUERY set QUERYDEFINITIONXML = @SYSTEMROLEEDITLISTMODIFIED where ID = @ID;
end
else
delete from dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCEEDIT where ADHOCQUERYID = @ID
-- now update the flag on the ad-hoc query table
update dbo.ADHOCQUERY set
SECURITYLEVEL = @SECURITYLEVEL,
SECURITYLEVELEDIT = @SECURITYLEVELEDIT,
CHANGEDBYID = @CHANGEAGENTID,
DATECHANGED = @CURRENTDATE
where
(ID = @ID) and
(
SECURITYLEVEL <> @SECURITYLEVEL or
SECURITYLEVELEDIT <> @SECURITYLEVELEDIT
)
return 0;
END TRY
BEGIN CATCH
exec dbo.USP_RAISE_ERROR;
return 1;
END CATCH