假设有两个数据库用户: (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 个客户端将连接到数据库。