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

Sql 实施有关用户和系统之间限制的策略,sql,oracle,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' )

如何以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>从评级中选择*

从评级中选择* * 第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;
/
更新:

创建此策略函数后,如果会话用户不是SYS,该函数将返回一个谓词。然后谓词将限制用户的行,查询将只显示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;
还有更多,但这满足了你的基本要求。
您可能需要检查静态和动态策略、策略组或安全相关列选项。

您所说的是哪种策略?您已经描述了每个Oracle数据库的默认安全状态。这涉及到数据库保险库吗?这只是一个初级任务,所以我认为一般命令是fine@pmdbaWhat是指“用户”吗?数据库用户或应用程序用户(不一定是同一个对象)?默认情况下,数据库用户只能查看自己的表,并且不能限制sysdba。应用程序用户(通过相同的服务帐户访问数据库)可能会使用sys_上下文和附加到表的虚拟专用数据库函数来保护其个人数据。这也不会限制sysdba。如果您正在学习VPD,请在这里发布一些您尝试过的代码,我们可以对其进行评估。我们不是来为你做家庭作业的。同时,阅读文档并查看示例:您不需要检查SESSION_USER='SYS',因为SYS根据定义不受VPD策略的约束。如果用户是SYS、SYSDBA等,则永远不会调用该函数。是,正确。我对答案作了修改。谢谢你提到这件事。