如何将策略函数写成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:策略谓词有错误
如果我理解正确,您希望为用户限制表中的数据,而不希望为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选项。