一种针对SQL分析查询的静态授权方法与流程

文档序号:18338529发布日期:2019-08-03 16:02阅读:382来源:国知局
一种针对SQL分析查询的静态授权方法与流程

本发明涉及数据库技术领域,尤其涉及一种适用于SQL分析查询的静态授权方法。



背景技术:

在实际中,SQL查询通常分为事务性查询和分析性查询。其中,分析性查询通过同时访问大量记录以进行统计分析。然而,由于数据库中通常包含敏感信息,并且不同用户也具有不同的数据访问权限,因此需要对SQL查询进行控制和授权。

目前,SQL语言标准中包含了简单的访问控制机制。该机制允许管理员将数据库表和列的访问权限授权给不同的用户。然而,对于SQL分析查询,该技术存在以下不足。首先,该机制只允许对列进行单独授权。但SQL分析查询通常会同时访问多个列以进行统计分析,并且列之间也可能存在关联情况。例如,当同时访问顾客表中地址列和收入列时,用户在得到这些信息的同时,也会得到每个地址的顾客的收入情况。因此,对于SQL分析查询,需要对多个列的同时访问进行授权。其次,该机制只能简单的禁止或允许对某些列的访问。

对于某些敏感的列,虽然SQL分析查询可以进行某些特定的操作以去除其中的敏感信息,例如聚合操作、截断操作等。但是其并没有将列的操作考虑在内,因此不能更精确地对SQL分析查询进行授权。

此外,管理员也可以通过定义视图(view)的访问分配访问权限。在该方法中,管理员可以为每个用户定义若干视图,并且要求用户只能基于被分配的视图,而非数据库中原有的表,编写SQL语句。然而,该方法的缺点在于,当数据库中的用户和视图较多时,管理员难以对现有的权限分配进行维护和管理。同时,该方法也会给用户带来额外的负担,当视图发生变化时,用户也需要对相关的SQL查询进行更新和修改。

最后,行级别的访问控制技术允许管理员将每个行的访问权限授权给用户,例如通过定义谓词或对行进行标记。然而,该方法同样不支持对多个列的同时访问以及操作进行限制。同时,由于该方法的授权时间与数据规模相关,因此当数据规模较大时,该方法会对SQL查询的执行过程产生较大的额外开销。



技术实现要素:

本发明就是基于现有数据库访问控制技术的上述问题,提出一种针对SQL分析查询的静态授权方法,其能够支持对多个列的同时访问以及操作进行控制,更加灵活;授权过程更加高效,适用于大规模的数据分析场景。

为实现以上目的,本发明的技术方案对现有访问控制技术进行扩展,提出一种针对SQL分析查询的静态授权方法,具体包括以下步骤:

S1:获取用户提交的SQL分析查询;所述SQL分析查询包括:输出和用于条件判断;

S2:针对SQL分析查询中的输出和用于条件判断构建出相应的系谱树;

S3:基于系谱树,提取出SQL分析查询的数据访问请求;

S4:基于访问控制规则,对数据访问请求进行授权。

更优选地,所述步骤S2中的系谱树是由数据库表中的列和转换操作组成的树,其中叶子节点是列,非叶子节点是转换操作。

更优选地,所述步骤S2具体包括:

为SQL分析查询所访问的每个数据库中表的每一个列都创建一棵由该列组成的系谱树;

按照SQL分析查询语句的执行顺序自底向上对SQL分析查询语句进行遍历,当遇到SQL分析查询语句中存在针对列的转换操作时,将该列的转换操作对应地拼接到这些系谱树上以得到一棵新的系谱树;当SQL分析查询语句中存在条件判断操作时,根据条件判断中的转换操作对系谱树进行更新,并将更新后的每棵系谱树放到条件判断操作集合中;当SQL分析查询语句中存在合并UNION、相交INTERSECT和除去EXCEPT语句时,对于其两个子查询中每一组相对应的列,将两个列对应的系谱树通过一个空转换操作合成一棵新的系谱树;

所有的SQL语句遍历完毕后,将SQL分析查询最终输出的每个列对应的系谱树都放入到输出outputs集合中。

更优选地,所述步骤S3中的数据访问请求包括某个用户以哪些动作访问了哪些列,并进行了哪些操作。

更优选地,所述步骤S4包括:

针对每条访问控制规则,首先检查数据访问请求是否触发该访问控制规则;如果触发,再检查数据访问请求是否满足该访问控制规则的限制;若满足,则继续遍历后续的访问控制规则,直至数据访问请求满足所有的访问控制规则时,该数据资源请求才被授权;否则,该数据资源请求将被拒绝。

更优选地,所述步骤S4中的访问控制规则包括:当一个用户同时访问一组列时,必须按照限制对列进行相应的操作。

更优选地,所述步骤S4中的访问控制规则包括:为每个列指定一个访问动作。

由上述本发明的技术方案可以看出,本发明具有如下技术效果:

相比于现有的数据库访问控制技术,本发明提出的针对SQL分析查询的静态授权方法结合了分析性查询的特点,支持对多个列的同时访问以及操作进行控制。因此,该方法可以更加灵活、精确的对SQL分析查询进行授权。同时,该方法允许管理员通过编写访问控制规则的方式进行权限管理,并且对用户没有额外的负担,因此更具有可用性。最后,该方法只基于SQL查询本身进行授权,因此授权过程更加高效,并适用于大规模的数据分析场景。

附图说明

附图1为本发明公开的针对SQL分析查询的静态授权方法流程图;

附图2为数据库表的示例;

附图3为从SQL分析查询中构建出的系谱树的示例。

具体实施方式

本发明提出的是一种针对SQL分析查询的静态授权方法,结合附图和实施例说明如下。

如图1所示,该方法包含以下步骤S1-S4。

S1:获取用户提交的SQL分析查询。所述SQL分析查询包括:输出、用于条件判断的列。

在SQL分析查询执行之前对其进行拦截,并进行分析和授权。当授权成功时,该SQL分析查询继续执行;否则,该SQL分析查询将被阻止,并返回给用户进行修改。

S2:利用SQL分析查询中的输出和用于条件判断的列,计算出该SQL分析查询对应的系谱树。系谱树是一棵由数据库表中的列和转换操作组成的树,其中叶子节点是列,非叶子节点是转换操作。

下面以给定一个SQL分析查询为例,按如下步骤计算系谱树:

1.首先,将系谱树中的两个集合outputs和conditions初始化为空集,并使其分别对应SQL分析查询的输出和用于条件判断的列。

2.为SQL分析查询所访问的每个表中每一个列都创建一棵由该列组成的系谱树。

3.按照SQL语句的执行顺序,自底向上按如下方式进行处理:

a)当遇到针对列的转换操作时(SELECT语句中的AS语句),对系谱树进行相应地更新以得到AS定义的列所对应的系谱树。具体的更新方法是首先得到AS语句中用到的每个列对应的系谱树,然后将该列的转换操作对应地拼接到这些系谱树上以得到一棵新的系谱树。

b)当遇到条件判断操作时(WHERE语句、HAVING语句、FROM语句和ORDER BY语句等),首先根据条件判断中的转换操作(如果有)对系谱树进行更新,并将更新后的每棵系谱树放到conditions集合中。

c)当遇到UNION、INTERSECT和EXCEPT语句时,对于其两个子查询中每一组相对应的列,将两个列对应的系谱树通过一个空转换操作合成一棵新的系谱树。

4.当处理完所有的SQL语句之后,将SQL分析查询最终输出的每个列对应的系谱树都放入到outputs集合中。

例如,考虑图2所示的数据库表,以及如下SQL分析查询:

在构建系谱树时,首先初始化outputs和conditions集合,并为Customer表、Address表和Store_Sales表中的每个列都创建一棵系谱树。之后,按照FROM、WHERE、GROUP BY和SELECT语句的顺序进行处理SQL分析查询。对于FROM语句中的连接操作,将ss_customer_id、c_id、c_addr_id和a_id等列对应的系谱树放入conditions集合中。之后,对于WHERE语句,将c_gender列对应的系谱树放入到conditions集合中。GROUP BY语句可以被直接忽略。而对于最后的SELECT语句,需要根据其中的转换操作对现有的系谱树进行更新以得到region列和avg_price列对应的系谱树。同时,这两个列对应的系谱树被加入到outputs集合中。图3给出了最终outputs集合和conditions集合中所包含的系谱树。

S3:基于系谱树,提取出SQL分析查询中的数据访问请求。该数据访问请求中包含某个用户以哪些动作访问了哪些列,并进行了哪些操作。

下面以给定的一个SQL分析查询为例进行说明:

将该查询对应的数据访问请求q表示成一个三元组q=(q.user,q.asso,q.oper)的形式。其中,q.user代表了提交查询的用户。q.asso是由查询所进行的数据访问组成的数组,其中每个数据访问包含一个列和对应的访问动作。访问动作包括output动作和condition动作,output动作对应查询直接输出的某个列,而condition动作代表查询将某个列用于条件判断中,但没有直接输出。最后,q.oper是由操作组成的数组,其中每一个操作对应了q.asso中的一个列。

因此,q.user可以直接根据提交该SQL分析查询的用户得到,而q.asso和q.oper则可以根据S2步骤中构建的系谱树按如下方式获得。对于每一棵系谱树,从叶子节点代表的列c开始,自底向上遍历找到应用于该列的第一个操作op。对于outputs集合中的系谱树,根据其中的每一个列c和操作op(op可以为空),向q.asso中添加一个数据访问(c,output),并向q.oper中添加一个操作op;而对于conditions集合中的系谱树,根据其中的每一个列c和操作op(op可以为空),向q.asso中添加一个数据访问(c,condition),并向q.oper中添加一个操作op。

例如,假设S2步骤中提到的SQL分析查询由用户user1提交,并且通过对图3所示的每棵系谱树进行遍历,可以得到对应的数据访问请求q=(q.user,q.asso,q.oper)如下:

其中,null代表空操作,即查询对该列没有进行任何操作。

S4:基于访问控制规则,对数据访问请求进行授权。

每一条访问控制规则规定了当某一个用户同时访问一组列时,必须根据限制对列进行相应的操作。将一条访问控制规则r表示成三元组r=(r.user,r.asso,r.res)的形式,其中r.user代表一个用户;r.asso是由n个数据访问组成的数组;r.res是由零个或多个限制组成的集合,其中一个限制是由n个操作集合组成的数组,并要求r.asso中的每个列都要进行对应集合中的一个操作。同时,数据访问请求应至少满足r.res中的一个限制;特别的,如果r.res中不包含任何限制,则数据访问请求将被直接禁止。

当对一个数据访问请求q进行授权时,首先按照如下步骤逐条检查每条访问控制规则r:

1.检查数据访问请求q是否触发访问控制规则r。

如果q.user=r.user,并且r.asso中的每个数据访问都包含于q.asso,则数据访问请求q触发访问控制规则r;否则,数据访问请求q不触发访问控制规则r,终止。

2.检查数据访问请求q是否满足访问控制规则r的限制。

首先,只在q.oper中保留r.asso中的列对应的操作,以得到数据访问请求q对r.asso中的列所进行的操作q.oper|r,其计算公式如下:

如果对于q.oper|r中的所有操作数组[op1,...,opn],在r.res中都存在一个限制(Δ1,...,Δn)使得对于每个1≤i≤n,要么Δi是空集,要么opi∈Δi,则数据访问请求q满足访问控制规则r。

最后,如果数据访问请求q满足每条被触发的访问控制规则,该数据访问请求将被授权;否则,该数据访问请求将被禁止。

例如,考虑S3步骤中提到的数据访问请求q,以及如下访问控制规则r1:

r1.user=user1

r1.asso=[(a_state,output),(ss_price,output)]

r1.res={[{},{avg,sum,min,max}]}

访问控制规则r1要求当用户user1同时输出a_state列和ss_price列时,需要对ss_price列进行avg、sum、min或max操作,但对a_state列没有要求。首先,由于q.user=r1.user,并且r1.asso中的两个数据访问都包含于q.asso,因此数据访问请求q触发了访问控制规则r1。进一步,可以得到数据访问请求q对r1.asso中的两个列所进行的操作为(null,avg)。对于r1.res中的限制[{},{avg,sum,min,max}],由于{}为空集,并且avg∈{avg,sum,min,max},因此进而得到数据访问请求q满足访问控制规则r1。

又如,考虑如下访问控制规则r2:

r2.user=user1

r2.asso=[(a_state,output),(a_city,output),(a_street,output)]

r2.res={}

访问控制规则r2禁止用户user1同时输出a_state列、a_city列和a_street列。虽然q.user=r2.user,但由于r2.asso中的数据访问(a_street,output)没有包含在q.asso中,即数据访问请求q没有输出a_street列,因此数据访问请求q并不触发访问控制规则r2。

虽然本发明已以较佳实施例公开如上,但实施例并不限定本发明。在不脱离本发明之精神和范围内,所做的任何等效变化或润饰,同样属于本发明之保护范围。因此本发明的保护范围应当以本申请的权利要求所界定的内容为标准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1