Oracle vs PostgreSQL DBA(21)- Oracle VPD

2023-05-20,,

本节简单介绍了Oracle VPD。VPD用于实现精细化的权限管理。

About Oracle Virtual Private Database

What?

VPD的做法:VPD自动添加where子句到SQL语句上

影响的对象:table、view、synonym

涉及的语句:select、insert、update、index和delete

不支持:DDL

基本做法示例:

SELECT
FROM OE.ORDERS;

—>应用VPD

SELECT FROM OE.ORDERS

WHERE SALES_REP_ID = 159;

Benefits

Security:不管用户如何访问数据,都可以确保精细化的访问控制策略得到执行。

Simplicity:只需要在table、view上操作一次即可

Flexibility:select、insert、update、delete都可以有自己的策略

Using Oracle Virtual Private Database with an Application Context

SELECT
FROM orders_tab

—>

SELECT FROM orders_tab

WHERE custno = SYS_CONTEXT (‘order_entry’, ‘cust_num’);

Components of an Oracle Virtual Private Database Policy

function

用于产生where子句(谓词)

输入参数:schema、object name

输出参数:where子句(有效的)

Configuring an Oracle Virtual Private Database Policy

What

function需与object进行绑定,可通过配置policy实现绑定。

policy本身用于管理VPD function,同时可以进行精细化访问控制,比如指定SQL语句类型或者策略影响的特定列。

Oracle提供了DBMS_RLS来进行策略管理:ADD、DROP、ENABLE/DISABLE…

How

例子:

SELECT fname, lname, ssn FROM emp;

—>

SELECT fname, lname, ssn FROM emp

WHERE ssn = ‘my_ssn’;

CREATE OR REPLACE FUNCTION hide_sal_comm (

v_schema IN VARCHAR2,

v_objname IN VARCHAR2)

RETURN VARCHAR2 AS

con VARCHAR2 (200);

BEGIN

con := ‘deptno=30’;

RETURN (con);

END hide_sal_comm;

/

BEGIN

DBMS_RLS.ADD_POLICY (

object_schema => ‘scott’,

object_name => ‘emp’,

policy_name => ‘hide_sal_policy’,

policy_function => ‘hide_sal_comm’,

sec_relevant_cols => ‘sal,comm’);

END;

/

— 设置敏感列输出

BEGIN

DBMS_RLS.ADD_POLICY(

object_schema => ‘scott’,

object_name => ‘emp’,

policy_name => ‘hide_sal_policy’,

policy_function => ‘hide_sal_comm’,

sec_relevant_cols =>’ sal,comm’,

sec_relevant_cols_opt => dbms_rls.ALL_ROWS);

END;

/

Tutorials

创建数据表,设定谓词为:username=’测试’

drop table t_vpd_1;
create table t_vpd_1(id int,username varchar2(20),name varchar2(30));
insert into t_vpd_1(id,username,name) values(1,'test','name1');
insert into t_vpd_1(id,username,name) values(2,'张三','name1');
insert into t_vpd_1(id,username,name) values(3,'测试','测试名称1');
insert into t_vpd_1(id,username,name) values(4,'测试','测试名称2');
commit;

创建函数

CREATE OR REPLACE FUNCTION func_testvpd_1( 
  schemaname IN VARCHAR2,
  tablename  IN VARCHAR2
 )
 RETURN VARCHAR2
 IS
  ret VARCHAR2 (400);
 BEGIN
  ret := 'username = ''测试''';
  RETURN ret;
 END func_testvpd_1;
/

创建策略(select)

BEGIN
  DBMS_RLS.DROP_POLICY (
    object_schema    => 'test',
    object_name      => 't_vpd_1',
    policy_name      => 'policy_t_vpd_1'
   );
 END;
/
BEGIN
  DBMS_RLS.ADD_POLICY (
    object_schema    => 'test',
    object_name      => 't_vpd_1',
    policy_name      => 'policy_t_vpd_1',
    function_schema  => 'test',
    policy_function  => 'func_testvpd_1',
    statement_types  => 'select'
   );
 END;
/

测试策略

-- 查询
select * from t_vpd_1;
-- 插入
TEST-orcl@DESKTOP-V430TU3>create table t_vpd_2 as select * from t_vpd_1 where 1=2;
Table created.
TEST-orcl@DESKTOP-V430TU3>insert into t_vpd_2(id,username,name) select * from t_vpd_1;
2 rows created.
TEST-orcl@DESKTOP-V430TU3>delete from t_vpd_1;
4 rows deleted.
TEST-orcl@DESKTOP-V430TU3>
TEST-orcl@DESKTOP-V430TU3>update t_vpd_1 set name = 'test';
0 rows updated.

创建策略(select、insert、update、delete)

BEGIN
  DBMS_RLS.DROP_POLICY (
    object_schema    => 'test',
    object_name      => 't_vpd_1',
    policy_name      => 'policy_t_vpd_1'
   );
 END;
/
BEGIN
  DBMS_RLS.ADD_POLICY (
    object_schema    => 'test',
    object_name      => 't_vpd_1',
    policy_name      => 'policy_t_vpd_1',
    function_schema  => 'test',
    policy_function  => 'func_testvpd_1',
    statement_types  => 'select,insert,update,delete'
   );
 END;
/

测试策略

insert into t_vpd_1(id,username,name) values(1,'test','name1');
insert into t_vpd_1(id,username,name) values(2,'张三','name1');
insert into t_vpd_1(id,username,name) values(3,'测试','测试名称1');
insert into t_vpd_1(id,username,name) values(4,'测试','测试名称2');
commit;
-- 查询
TEST-orcl@DESKTOP-V430TU3>select * from t_vpd_1;
        ID USERNAME             NAME
---------- -------------------- ------------------------------
         3 测试                 测试名称1
         4 测试                 测试名称2
-- 插入
TEST-orcl@DESKTOP-V430TU3>drop table t_vpd_2 ;
Table dropped.
TEST-orcl@DESKTOP-V430TU3>create table t_vpd_2 as select * from t_vpd_1 where 1=2;
Table created.
TEST-orcl@DESKTOP-V430TU3>insert into t_vpd_2(id,username,name) select * from t_vpd_1;
2 rows created.
TEST-orcl@DESKTOP-V430TU3>update t_vpd_1 set name = 'test';
2 rows updated.
TEST-orcl@DESKTOP-V430TU3>delete from t_vpd_1;
2 rows deleted.
TEST-orcl@DESKTOP-V430TU3>

《Oracle vs PostgreSQL DBA(21)- Oracle VPD.doc》

下载本文的Word格式文档,以方便收藏与打印。

  • postgresql数据库优化的方法是什么
    postgresql数据库优化的方法是什么

    使用索引:在经常查询的列上创建索引,可以提高查询效率。 使用合适的数据类型:选择合适的数据类型可以减小存储空间,提高查询速度。 优化查询语句:尽量避免使用复杂的查询语句,可以提高查询效率。 使...

    2024-05-07编程代码
  • PostgreSQL中如何管理大数据集
    PostgreSQL中如何管理大数据集

    在 PostgreSQL 中管理大数据集通常需要采取一些优化策略和技术。以下是一些常见的方法: 索引优化:为大数据集中频繁查询的列创建索引,以提高查询性能。避免创建过多的索引,因为这可能会增加写操作的开销。 ...

    2024-04-02编程代码
  • PostgreSQL中的连接池怎么管理与应用
    PostgreSQL中的连接池怎么管理与应用

    在 PostgreSQL 中,连接池是一种用于管理数据库连接的技术,可以有效地减少应用程序与数据库之间的连接开销,提高数据库访问的性能和效率。连接池会维护一组事先创建好的数据库连接,并在应用程序需要时提供这些...

    2024-04-02编程代码
  • PostgreSQL权限和角色怎么管理使用
    PostgreSQL权限和角色怎么管理使用

    在PostgreSQL中,权限和角色是用来控制数据库访问和操作的重要机制。权限用于控制用户或角色对数据库对象(如表、视图、函数等)的操作权限,而角色用于管理用户和组的集合。 下面是如何管理权限和角色在PostgreS...

    2024-04-02编程代码
  • PostgreSQL中怎么创建和管理数据库
    PostgreSQL中怎么创建和管理数据库

    要在PostgreSQL中创建和管理数据库,可以按照以下步骤进行操作: 创建数据库: 可以使用以下命令在PostgreSQL中创建数据库: CREATE DATABASE dbname; 其中,dbname是要创建的数据库的名称。 连接到数据库: ...

    2024-04-02编程代码
  • PostgreSQL中的锁机制是什么
    PostgreSQL中的锁机制是什么

    PostgreSQL中的锁机制是用来控制并发访问数据库中数据的方式。它可以防止多个会话同时对同一数据进行修改,从而避免数据不一致的问题。 PostgreSQL中的锁可以分为两种类型:共享锁和排它锁。共享锁(Share Lock)...

    2024-04-02编程代码
  • PostgreSQL的基本架构和组件是什么
    PostgreSQL的基本架构和组件是什么

    PostgreSQL的基本架构和组件如下: Query Processor:负责解析SQL查询语句并生成执行计划。 Parser:负责将SQL语句解析为内部的数据结构树。 Rewriter:负责将查询进行优化和重写,以提高性能。 Optimize...

    2024-04-02编程代码
  • PostgreSQL的触发器使用场景有哪些
    PostgreSQL的触发器使用场景有哪些

    数据完整性约束:当需要在数据库中设置一些数据完整性约束时,可以使用触发器来确保数据的一致性和完整性。 日志记录:触发器可以用来记录用户对数据库进行的操作,如对某个表的增删改查操作,以便日后追溯和...

    2024-04-02编程代码