0

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

我需要根据数据限制两个用户的表访问。我正在使用 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 个客户端将连接到数据库。

4

1 回答 1

2

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

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

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

于 2013-01-30T13:31:08.473 回答