UFN_SECURITY_APPUSER_GRANTED_ADHOCQUERYINSTANCEEDIT_IN_SYSTEMROLE

Returns true if user has been granted and not denied permission to edit the ad-hoc query instance for a system role.

Return

Return Type
bit

Parameters

Parameter Parameter Type Mode Description
@APPUSERID uniqueidentifier IN
@ADHOCQUERYID uniqueidentifier IN

Definition

Copy


CREATE function dbo.UFN_SECURITY_APPUSER_GRANTED_ADHOCQUERYINSTANCEEDIT_IN_SYSTEMROLE
(
  @APPUSERID uniqueidentifier,
    @ADHOCQUERYID uniqueidentifier
)
  returns bit
as
  /*
  Returns true if user has been granted and not denied permission to edit the ad-hoc query instance for a System Role.
  */
begin
    --If at least one grant and no deny then return true

    --otherwise, false

    declare @GRANT bit;
    set @GRANT=0;

    -- note that this routine assumes the check for SysAdmin has been performed already


    -- check to see if the user is the ower of the query, or the query has been granted to everyone

    declare @OWNERID uniqueidentifier;
    declare @SECURITYLEVEL tinyint;
    declare @SECURITYLEVELEDIT tinyint;
    declare @SITEID uniqueidentifier;

    set @SECURITYLEVEL = 0;
    set @SECURITYLEVELEDIT = 0;
    select 
        @OWNERID = OWNERID, 
        @SECURITYLEVEL = SECURITYLEVEL, 
        @SECURITYLEVELEDIT = SECURITYLEVELEDIT, 
        @SITEID = SITEID 
    from dbo.ADHOCQUERY (nolock) where ID = @ADHOCQUERYID;

    if (@SITEID is not null) and (dbo.UFN_SITEALLOWEDFORUSER(@APPUSERID, @SITEID) <> 1)
        return 0;

    if (@OWNERID = @APPUSERID) or (@SECURITYLEVELEDIT = 0)
        set @GRANT = 1;   

    -- user isn't the owner, and the query has not been granted to everyone; check to see if the user has been 

    -- granted (and not denied) explicit edit rights to the ad-hoc query instance.

    if @GRANT = 0
    begin
        --order by GRANTORDENY, deny will be first.

        select top 1 
            @GRANT = SECURITYVIEWEDIT.GRANTORDENY
        from dbo.V_SECURITY_SYSTEMROLEASSIGNMENT_USER_ADHOCQUERYINSTANCEEDIT (nolock) SECURITYVIEWEDIT
        inner join dbo.ADHOCQUERY (nolock) on SECURITYVIEWEDIT.ADHOCQUERYID = ADHOCQUERY.ID
        left join dbo.SYSTEMROLEPERM_ADHOCQUERYINSTANCE (nolock) on 
            ADHOCQUERY.SECURITYLEVEL <> 0 and -- No need to check SYSTEMROLEPERM_ADHOCQUERYINSTANCE if run permissions is GRANTed to all users

            SECURITYVIEWEDIT.SYSTEMROLEID = SYSTEMROLEPERM_ADHOCQUERYINSTANCE.SYSTEMROLEID and
            SECURITYVIEWEDIT.ADHOCQUERYID = SYSTEMROLEPERM_ADHOCQUERYINSTANCE.ADHOCQUERYID and
            SYSTEMROLEPERM_ADHOCQUERYINSTANCE.GRANTORDENY = 1
        where 
            (SECURITYVIEWEDIT.APPUSERID = @APPUSERID) and 
            (SECURITYVIEWEDIT.ADHOCQUERYID = @ADHOCQUERYID) and
            (
                -- Verify that either all roles can run this query or this role is granted run permission

                ADHOCQUERY.SECURITYLEVEL = 0 or -- All users

                SYSTEMROLEPERM_ADHOCQUERYINSTANCE.ID is not null
            )                        
        order by 
          SECURITYVIEWEDIT.GRANTORDENY asc;
    end;

    return @GRANT;
end