sql - 实施有关用户和系统之间限制的策略
问题描述
如何写一个策略函数作为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: 策略谓词有错误
解决方案
如果我理解正确,您希望为用户限制表中的数据,并且不想限制 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 选项。
推荐阅读
- anylogic - 如何在anylogic中获得车道上的汽车数量?
- hibernate - 如何直接从 jpql 查询(休眠)构造自定义对象列表
- google-chrome - Chrome 仅将某些图像显示为 webp
- excel - 迭代时如何计算目录中所有文件的总和?
- mongodb - MongoDB - 聚合找到没有。条目日期明智的
- flutter - Flutter - 使用提供程序在 init 上获取数据的最佳方法
- c# - 使用 Azure Functions 项目的构建后事件复制 PDB
- php - 使用 PHP 编辑数据库中的条目
- c++ - 如何解决流动代码中的逻辑错误?
- javascript - 访问 Javascript 对象中的数组