使用静态或上下文敏感的VPD策略来限制特定用户的表访问?

时间:2013-01-30 09:57:09

标签: performance oracle oracle11g

假设有两个数据库用户:(1)名为APP的用户经常连接到数据库,并在他自己的模式中查询和修改许多表。 (2)名为WEB的用户很少只连接到数据库,只查询和修改APP模式中的几个表。

我需要根据数据限制两个用户的表访问权限。我正在使用Oracle虚拟专用数据库(VPD)功能(有时也称为细粒度访问控制)来执行此操作。对于这个问题,只有限制APP用户的规则很重要。限制WEB用户的规则需要采用单独的VPD策略(我稍后可能会针对该策略提出类似的问题)。

以下两种实现中的哪一种可以为APP用户提供更好的查询和DML性能?

1)使用policy_type dbms_rls.SHARED_CONTEXT_SENSITIVE创建策略并实现如下的策略功能:

FUNCTION get_predicate(i_schema IN VARCHAR2, i_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
  IF SYS_CONTEXT('USERENV', 'SESSION_USER') = 'WEB' THEN
    RETURN NULL;
  END IF;

  RETURN 'some_id_column = SYS_CONTEXT(''APP'', ''some_id'')';
END get_predicate;

2)使用policy_type dbms_rls.SHARED_STATIC创建策略并实现如下的策略功能:

FUNCTION get_predicate(i_schema IN VARCHAR2, i_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
  RETURN 'SYS_CONTEXT(''USERENV'', ''SESSION_USER'') = ''WEB'' OR some_id_column = SYS_CONTEXT(''APP'', ''some_id'')';
END get_predicate;

请注意,APP用户使用客户端连接池(由ODP.NET提供),因此它应该只为每个应用程序使用会话打开几个连接。大约有100个客户端将连接到数据库。

1 个答案:

答案 0 :(得分:2)

STATIC谓词将仅针对会话进行一次评估,而每次中间层(或应用程序)重新设置上下文时,将重新评估CONTEXT_SENSITIVE谓词。如果大多数连接是通过同一个用户(APP),那​​么您可能不会有很多上下文更改(取决于您在连接层中管理事物的方式)。

但是,即使你有大量的上下文更改,如果重新评估CONTEXT_SENSITIVE谓词的开销是连接总成本的一个明显因素,我会非常惊讶。几乎可以肯定,您在架构的其他部分可以获得更大的性能提升。

因此,选择更容易理解或提供更大灵活性的选项。只有你可以决定什么标准才重要。例如,如果您在程序包中构建策略字符串生成器(而不是发布的独立函数)并且该程序包不保持状态,则可以在不中断会话的情况下动态更改策略。但是,除非您终止会话,否则不会应用STATIC策略。