如何像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: 策略谓词有错误
答案 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 选项。