实施有关用户和系统之间限制的策略

时间:2021-04-06 01:36:41

标签: sql oracle

如何像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;

从评级中选择 * * 第 1 行的错误: ORA-28113: 策略谓词有错误

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您想限制用户表中的数据,而不想限制 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 选项。

相关问题