首页 > 解决方案 > 实施有关用户和系统之间限制的策略

问题描述

如何写一个策略函数作为scott来实现如下策略:用户只能访问自己的数据,但是sysdba应该可以不受限制地访问任何数据,然后将策略附加到表中。?

您的回答可能会有很大帮助。谢谢你。

更新:

SCOTT > CREATE FUNCTION POLICY (
p_schema IN VARCHAR2,
p_object IN VARCHAR2
)
RETURN VARCHAR2
AS
BEGIN
if(SYS_CONTEXT('userenv', 'SESSION_USER') = 'SYS' ) THEN RETURN '';
else 
RETURN 'NAME = SYS_CONTEXT ("USERENV", "SESSION_USER")';
END IF;


SYS AS SYSDBA> EXECUTE DBMS_RLS.ADD_POLICY (object_schema=>'SCOTT', OBJECT_NAME=>'RATING', POLICY_NAME=>'FIRST_POLICY', FUNCTION_SCHEMA=>'SCOTT', POLICY_FUNCTION=>'POLICY', STATEMENT_TYPES=>'SELECT', UPDATE_CHECK=>TRUE);

PL/SQL procedure successfully completed.

错误: SCOTT > SELECT * FROM RATING;

SELECT * FROM RATING * ERROR at line 1: ORA-28113: 策略谓词有错误

标签: sqloracle

解决方案


如果我理解正确,您希望为用户限制表中的数据,并且不想限制 SYS 的数据。您需要在表中有一个列来指定哪些行属于哪个用户。作为示例,我采用了 USER 列,它可以是其他内容。

CREATE FUNCTION SCOTT_POLICY(schema_in in VARCHAR2, table_in in VARCHAR2)
RETURN VARCHAR2
AS
  RESTRICTION VARCHAR2(100);
  SESSION_USER VARCHAR2(50);
BEGIN
      SELECT sys_context('USERENV', 'SESSION_USER') INTO SESSION_USER FROM DUAL;
    
      RESTRICTION := 'UPPER(USER) = '||DBMS_ASSERT.ENQUOTE_LITERAL(SESSION_USER);
      RETURN RESTRICTION;
END;
/

更新:

创建此策略函数后,如果 SESSION USER 不是 SYS,它将返回一个谓词。然后谓词将限制用户的行,查询将仅显示 USER = (CURRENT SESSION USER) 条件满足的行。如果用户是 SYS,则不会调用该函数,并且不会将谓词附加到查询中,从而获取所有行。RLS 策略不适用于 SYS 用户。要使用策略附加策略功能,请使用 DBMS_RLS 包

BEGIN
  DBMS_RLS.ADD_POLICY(OBJECT_SCHEMA => 'SCOTT', OBJECT_NAME => 'YOURTABLENAME', POLICY_NAME => 'SCOTT_POLICY', FUNCTION_SCHEMA => 'SCOTT', POLICY_FUNCTION => 'SCOTT_POLICY');
END;

还有更多,但这满足了您的基本要求。您可能需要检查静态和动态策略、策略组或 sec_relevant_col 选项。


推荐阅读