Oracle handbook系列之虚拟专用数据库VPD的使用详解
- 格式:doc
- 大小:72.50 KB
- 文档页数:4
oracle orapwd命令使用说明Oracle orapwd命令使用说明介绍本文将为您详细介绍Oracle数据库中orapwd命令的使用说明。
orapwd命令是Oracle数据库管理工具中的一部分,用于管理数据库的密码文件。
安装orapwd命令已经包含在Oracle数据库的安装文件中,无需额外安装。
创建密码文件要创建密码文件,可以使用以下命令:orapwd file=<password_file> password=<password> ent ries=<number_of_entries>参数说明: - file:指定要创建的密码文件的路径和文件名。
- password:指定密码文件的密码。
- entries:指定密码文件可以存储的最大密码数。
修改密码文件密码如果需要修改密码文件的密码,可以使用以下命令:orapwd file=<password_file> password=<new_password>参数说明: - file:指定要修改密码的文件的路径和文件名。
- password:指定新的密码。
删除密码文件要删除密码文件,可以使用以下命令:orapwd file=<password_file> delete参数说明: - file:指定要删除密码的文件的路径和文件名。
查询密码文件信息要查询密码文件的信息,可以使用以下命令:orapwd file=<password_file> display参数说明: - file:指定要查询密码的文件的路径和文件名。
总结通过本文,我们了解了orapwd命令的基本使用方法,包括如何创建、修改和删除密码文件,以及如何查询密码文件信息。
熟练掌握这些知识,将有助于有效管理Oracle数据库的密码。
注意事项在使用orapwd命令时,需要注意以下几点:1.谨慎操作:orapwd命令可以更改数据库中的密码文件,因此在使用命令前,请确保您具有足够的权限,并且仔细核对命令参数,以免造成不必要的损失或安全风险。
Oracle VaultOracle数据库作为目前最成熟的商业数据库,在稳定其核心功能的同时也针对数量众多的用户群提出了很多安全运维工具解决方案。
在数据层面,Oracle有三个代表新的技术:Virtual Private Database(VPD)、Label Security和Oracle Vault。
VPD主要是针对解决应用层面的数据访问需求添加数据访问权限,Label Security是VPD某种程度的拓展升级。
而Vault主要是对Oracle数据库的安全职责进行分离,将数据安全责任从用户甚至sys 身上剥离出去,进行细粒度的安全责任分配。
1、Oracle Vault简述Oracle Vault是官方推荐的security策略之一,它主要用于运维机构中对数据的保护。
传统意义的Oracle 安全是一种“sys上帝”的主宰模型。
我们虽然有各种系统、角色和对象权限,虽然各种安全手册要我们使用非sys用户进行维护工作,但是很多数据库管理员还是在使用sys进行所有工作。
一些数据防护技术,比如VPD虽然可以实现数据层面的控制,但是对sys也是无效的。
更重要的是一些any类的系统权限,如select any table,一旦赋予,用户其实就控制了所有数据表的数据访问。
这个是非常武断的做法,潜藏着很大问题。
在“sys上帝”的前提控制下,这样的局面是控制不住的。
因为一些运维操作,如数据备份、导入导出是避免不了高级访问权限的。
“要么不做、要么别管”就是我们目前很多运维机构的现状。
Oracle Vault提供了sys用户削权的一种选择。
作为Oracle数据库的一个可选组件,Vault是需要额外的文件链接、注册和安装的。
安装vault之后,Oracle会去创建一个全新的用户dbvowner,原有的sys对一些数据的操作和访问权限,也都有进行控制的可能。
Vault中的三个核心要素:Realm (领域)、Factor(因素)和规则(Rule)。
五种类型的策略、列相关策略以及列屏蔽使得 VPD 成为 DBA 的安全工具箱中一种功能更加强大的工具。
虚拟专用数据库 (VPD) 也称为细粒度访问控制,它提供强大的行级安全功能。
它是在Oracle8i 中推出的,已经受到广泛的欢迎,并且在从教育软件到金融服务等各种应用程序得到采用。
VPD 的工作方法是,通过透明地更改对数据的请求,基于一系列定义的标准向用户提供表的局部视图。
在运行时,所有查询都附加了谓词,以便筛选出准许用户看到的行。
例如,如果只允许用户查看帐户管理员 SCOTT 的帐户,则 VPD 设置自动地将查询:select * from accounts;重写为:select * from accounts where am_name = 'SCOTT';DBA 在表 ACCOUNTS 上设置了一项安全策略。
该策略具有一个相关函数,称为policy function,它返回一个用作谓词的字符串 where am_name = 'SCOTT'。
如果您不熟悉该特性的全部功能,我建议您阅读 Oracle 杂志的文章“利用 VPD 保持信息的私密性”。
策略类型生成谓词所需的重复分析是一种在某些情况下可以进行修整的开销。
例如,在大部分实际情况中,谓词并不象 am_name = 'SCOTT' 那样是静态的;它基于用户的身份、用户的权限级别、用户向哪个帐户管理员进行报告等情况,可能更具有动态性。
由策略函数创建并返回的字符串可能会具有很强的动态性,而为了保证其结果,Oracle 必须每次重新执行策略函数,既浪费资源又降低性能。
在这种类型的策略中,谓词每次执行时可能会有很大的差别,该策略称为“动态”策略,在 Oracle9i 数据库以及以前的版本中已经提供了这种策略。
除了保留动态策略之外,Oracle 数据库 10g 还基于谓词的构造推出了几种新类型的策略,为提高性能提供了更好的控制:context_sensitive、shared_context_sensitive、shared_static 和 static。
基于Oracle数据库的作战数据虚拟化安全应用方法研究作者:张连喜王林来源:《信息安全与技术》2013年第04期【摘要】随着作战数据库应用系统中大量重要、敏感数据的增长,数据库中数据的安全显得极为重要。
本文尝试基于Oracle的数据库管理系统进行作战数据安全访问控制,重点介绍通过虚拟专用数据库(Virtual Private Database, VPD)实现多个相关数据库间共享表的安全,以达到“细”粒度访问控制。
【关键词】作战数据;数据安全;虚拟化应用;粒度;访问控制1 引言随着计算机网络及作战指挥系统的快速发展,作战数据库大量重要、敏感数据不断增长,信息资源的利用和保护日益引起人们的重视,尤其作战数据安全显得极为重要。
花费大量人力物力开发建立的作战数据库系统由于安全问题没有有效得到控制只能闲置一旁,这不仅造成了巨大的浪费,而且大大制约了各类指挥信息系统的进一步发展。
如何基于现有信息体系构造数据库安全环境,本文尝试基于Oracle的作战数据库系统进行数据库安全访问控制,重点介绍通过虚拟专用数据库(Virtual Private Database, VPD)实现多个特定数据库间共享表的安全,以达到“细”粒度访问控制。
1.1 数据库访问控制访问控制是对用户访问数据库各种资源(包括基表、视图、各种目录以及实用程序等)的权利(包括创建、撤消、查询、增、删、改、执行等)的控制,这是保障数据库安全的基本手段。
数据库用户按其访问权利的大小,一般可分为三类:1)一般数据库用户(具有CONNECT特权的用户);2)具有支配部分数据库资源的数据库用户(具有RESOURCE特权的用户);3)具有DBA特权的数据库用户。
不同用户对数据库有不同的访问权限,DBMS按用户的访问权限来控制其对数据库的访问,主要解决两个问题,一个是用户的标识与鉴别,一个是授权。
1.2 应用进程安全性作为数据库的开发人员,在设计和实现数据库时都要面对大量的应用安全问题。
Oracle10g中的虚拟专用数据库(VPD)什么是VPD所谓虚拟专用数据库(VPD)指的是,通过在数据库里进行配置,从而让不同的用户只能查看某个表里的部分数据。
VPD分为以下两个级别:行级别:在该级别下,可以控制某些用户只能查看到某些行数据。
例如对于销售数据表来说,每一名销售人员仅仅能检索自己的销售数据,而不能检索其他用户的销售数据。
列级别:在该级别下,可以控制某些用户不能检索某些列的数据。
例如HR用户下的EMPLOYEES表,包含salary这一个列,表示工资。
由于该列不允许任何用户都可以看到,所以可以在这个列上使用一些设置,这样其他一些用户查看这一列信息时,其数值均为NULL。
利用Oracle的细粒度访问控制,可用一种非常复杂的方式调整安全策略,可将细粒度访问控制用于以下目的:l 通过SELECT、INSERT、UPDATE、DELETE语句实施行访问控制l 建立一个安全策略,它基于某个列的特定值控制访问l 创建与查询执行中动态更改策略相同的方式使用的策略l 创建一组安全策略,成为策略组基于行的VPD基于行的VPD也叫做Fine-Grained Access Control,即FGAC。
FGAC通过定义规则来实现,规则的集合叫做FGAC政策(Policy)。
如果对某个表设置了FGAC,则当用户对该表发出查询或者DML语句时,Oracle都会根据定义的FGAC政策,而自动改写这些SQL语句。
其改写方式为自动在SQL语句后面添加where条件。
使用FGAC策略来限定返回记录的方式具有很多优点。
例如:不需要改写应用程序,对用户完全透明,集中设置,便于管理等。
在使用FGAC时,会涉及到应用程序上下文(Application Context)的概念,使用应用程序上下文可以简化FGAC管理的实现。
应用程序上下文是一个数据库对象,可以把它理解为数据库里的每一个session的全局环境变量。
一旦用户登录到数据库,从而创建出session以后,应用程序上下文就在整个session的生命周期里可用。
oracle中文使用手册Oracle是一款功能强大的关系型数据库管理系统,广泛应用于企业数据管理和应用开发领域。
本手册将详细介绍Oracle数据库的基本概念、常用命令和操作方法,以帮助初学者快速上手和熟练使用Oracle。
1. Oracle简介Oracle是美国Oracle公司开发的一种关系型数据库管理系统。
它是目前企业级应用系统首选的数据库产品之一,被广泛应用于各个行业的数据管理和应用开发中。
Oracle具有可靠性高、性能优异、安全性强等特点,成为大型企业数据处理的首选。
2. 安装与配置在开始使用Oracle之前,首先需要进行安装和配置。
可以从Oracle官方网站下载安装程序,根据提示进行安装。
安装完成后,需要进行一些基本的配置,如创建数据库实例、设置监听器等。
详细的安装和配置过程可以参考Oracle官方提供的文档或手册。
3. 数据库连接与登录使用Oracle数据库前,需要先进行数据库连接和登录。
可以使用SQL*Plus命令行工具或Oracle SQL Developer等图形化界面工具来进行连接和登录。
在连接时需要提供数据库的主机名、端口号和SID等信息,以及合法的用户名和密码。
连接成功后,即可开始对数据库进行操作。
4. SQL基本操作SQL是结构化查询语言,用于在关系型数据库中进行数据的增删改查等操作。
下面介绍一些常用的SQL命令:- 创建表: 使用CREATE TABLE语句可以创建数据表,并指定表的字段、数据类型、约束等信息。
- 插入数据: 使用INSERT INTO语句可以向表中插入数据。
- 更新数据: 使用UPDATE语句可以更新表中的数据。
- 删除数据: 使用DELETE FROM语句可以删除表中的数据。
- 查询数据: 使用SELECT语句可以查询表中的数据。
5. 数据库事务和锁机制数据库事务是指对数据库进行的一系列操作,要么全部执行成功,要么全部不执行。
Oracle提供了事务管理机制,可以确保数据库的一致性和完整性。
OracleVPD实现数据细粒度访问(更好的权限控制)Oracle VPD实现数据细粒度访问(更好的权限控制)分类: Oracle 2010-01-19 21:28 480人阅读评论(0) 收藏举报概述虚拟专用数据库(VPD) 提供了角色和视图无法提供的行级访问控制。
对于互联网访问,虚拟专用数据库可以确保在线银行的客户只能看到他们自己的帐户。
Web 托管公司可以在同一Oracle 数据库中维护多个公司的数据,但只允许每个公司查看其自身数据。
在企业内部,虚拟数据库可在应用程序部署方面降低拥有成本。
可以在数据库服务器一次实现安全性,而不用在访问数据的每个应用程序中分别实现安全性。
因为是在数据库中实施安全性,所以不管用户访问数据的方式如何,安全性较以前更高。
访问即席查询工具或新报表生成程序的用户不再能绕过安全环节。
虚拟专用数据库是一项重要技术,使企业能够构建托管的、基于 Web 的应用程序。
实际上,许多Oracle 应用程序本身使用VPD 实施数据分隔,包括Oracle 和 Oracle Portal 等程序。
虚拟专用数据库如何工作将一个或多个安全策略与表或视图关联后,就可以实现虚拟专用数据库。
对带安全策略的表进行直接或间接访问时,数据库将调用一个实施该策略的函数。
策略函数返回一个访问条件(WHERE 子句),即谓词。
应用程序将它附加到用户的SQL 语句,从而动态修改用户的数据访问权限。
你可以通过编写一个存储过程将SQL 谓词附加到每个SQL 语句(用于控制该语句的行级别访问权限)来实施 VPD。
例如,如果 John Doe(他属于 Department 10)输入 SELECT * FROM emp 语句,则可以使用 VPD 添加 WHERE DEPT = 10 子句。
这样,您便可以通过对查询进行修改来限制访问某些行的数据。
虚拟专用数据库确保无论用户以何种方式访问数据(通过应用程序、报表编写工具或SQL*Plus),都将强制实施同一强大的访问权限控制策略。
VPD,Oracle Virtual Private Database,即Oracle虚拟专用数据库,是指通过应用一些策略,使得用户只能访问被允许访问的那部分数据。
其原理相对简单,Oracle根据策略自动为相应用户提交的语句添加Where句,从而控制用户可以访问和操作的数据。
首先我们准备演示用的几张表,并插入少量的测试数据:1.CREATETABLEvpdsample_clothing(2.clothing_idNUMBER,3.typeVARCHAR2(30),4.brandVARCHAR2(30),5.descriptonVARCHAR2(100)6.);7.--8.INSERTINTOvpdsample_clothingVALUES(10002,'jacket','ABC','autumnstyle');9.INSERTINTOvpdsample_clothingVALUES(10003,'t-shirt','XYZ','summerstyle');mit;11.CREATETABLEvpdsample_books(12.book_idNUMBER,VARCHAR2(30),14.authorVARCHAR2(20)15.);16.--17.INSERTINTOvpdsample_booksVALUES(10005,'CountryDriving','PeterHessler');18.INSERTINTOvpdsample_booksVALUES(10006,'Lifewithoutlimits','NickVujicic');mit;(以上两个表模拟一个简单的库存情况,库中有两类物品,服装、图书。
这里我们需要满足两个表中的ID的唯一性(可以通过sequence来实现)。
oracleorapwd命令使用说明Oracle数据库的orapwd命令,主要用来建立密码(口令)文件。
一.查看帮助信息[oracle@oracle11g dbs]$ orapwdUsage: orapwd file=<fname> entries=<users> force=<y/n> ignorecase=<y/n> nosysdba=<y/n>wherefile - name of password file (required),password - password for SYS will be prompted if not specified at command line,entries - maximum number of distinct DBA (optional),force - whether to overwrite existing file (optional),ignorecase - passwords are case-insensitive (optional),nosysdba - whether to shut out the SYSDBA logon (optional Database Vault only).There must be no spaces around the equal-to (=) character.二.密码文件的默认位置1.windows操作系统下默认的位置是$ORACLE_HOME\database目录,默认的文件名是 pwd<ORACLE_SID>.ora,其它的文件名,都是不认的。
2.Unix/linux操作系统下默认的位置是$ORACLE_HOME/dbs目录,默认的文件名是orapw<ORACLE_SID>,其它的文件名,都是不认的。
VPD文档作者: 三Bear 创建日期: 2015-04-10更新日期: 2015-04-10当前版本: 1.0目录目录文档作者:三Bear (1)目录 (2)文档控制 (3)更改记录 (3)审阅 (3)分发人员 (3)VPD概述 (4)一个VPD实例 (5)MOAC (8)MOAC的VPD实现 (8)文档控制更改记录审阅分发人员VPD概述什么是VPD(虚拟专用数据库)VPD(虚拟专用数据库),主要作用是根据运行环境的上下文,隐式的添加条件。
简单的说,VPD就是向特定的数据库对象附加一个安全策略,在对这个对象操作的过程在中,会自动的使用这个安全策略进行验证,同时满足自定义条件和安全策略的操作才会获得预期的结果。
应用程序上下文(Application context)的理解应用程序上下文就像一个全局变量,里面记录了用户的各种登陆信息,以及客户化的各种参数。
VPD就是根据这些数据,来为我们的sql语句隐式的添加判断条件。
VPD的实际意义好处是在数据库层解决细粒度的角色权限访问,避免在中间层写大量代码。
说白了,VPD就是在表里面添加一个策略,也就是一个where条件。
每当我们查询这个表的时候就会触发这个策略,必须满足这个条件的数据才能被查出来。
而且,这个条件是根据上下文环境变化的,不同的环境可能会取不同的数据。
一个VPD实例1)在APPS 中创建表,赋权给PO, ONT用户create table hand_vpd_test_tb1(column1 varchar2(30),db_user varchar2(30));CREATE PUBLIC SYNONYM hand_vpd_test_tb1 FOR apps.hand_vpd_test_tb1 ;grant select ,insert, update on hand_vpd_test_tb1 to po,ont;2)创建策略函数packagecreate or replace package HAND_VPD_TST_SECURITY isFUNCTION Select_Security(Owner VARCHAR2, Objname VARCHAR2) RETURNVARCHAR2;FUNCTION Insert_Security(Owner VARCHAR2, Objname VARCHAR2)RETURNVARCHAR2;end HAND_VPD_TST_SECURITY;create or replace package body HAND_VPD_TST_SECURITY isFUNCTION SELECT_SECURITY(Owner VARCHAR2, ObjnameVARCHAR2)RETURN VARCHAR2 ISPredicate VARCHAR2(2000);BEGINPredicate := 'DB_USER = SYS_CONTEXT(''USERENV'',''CURRENT_USER'')';RETURN Predicate;END Select_Security;FUNCTION INSERT_SECURITY(Owner VARCHAR2, Objname VARCHAR2)RETURN VARCHAR2 ISPredicate VARCHAR2(2000);BEGINPredicate := 'DB_USER = SYS_CONTEXT(''USERENV'',''CURRENT_USER'')';--Predicate := null;RETURN Predicate;END Insert_Security;end HAND_VPD_TST_SECURITY;其中SYS_CONTEXT(''USERENV'',''CURRENT_USER'')是得到上下文USERENV中CURRENT_USER的值。
VPD,Oracle Virtual Private Database,即Oracle虚拟专用数据库,是指通过应用一些策略,使得用户只能访问被允许访问的那部分数据。
其原理相对简单,Oracle根据策略自动为相应用户提交的语句添加Where句,从而控制用户可以访问和操作的数据。
首先我们准备演示用的几张表,并插入少量的测试数据:1.CREATETABLEvpdsample_clothing(2.clothing_idNUMBER,3.typeVARCHAR2(30),4.brandVARCHAR2(30),5.descriptonVARCHAR2(100)6.);7.--8.INSERTINTOvpdsample_clothingVALUES(10002,'jacket','ABC','autumnstyle');9.INSERTINTOvpdsample_clothingVALUES(10003,'t-shirt','XYZ','summerstyle');mit;11.CREATETABLEvpdsample_books(12.book_idNUMBER,VARCHAR2(30),14.authorVARCHAR2(20)15.);16.--17.INSERTINTOvpdsample_booksVALUES(10005,'CountryDriving','PeterHessler');18.INSERTINTOvpdsample_booksVALUES(10006,'Lifewithoutlimits','NickVujicic');mit;(以上两个表模拟一个简单的库存情况,库中有两类物品,服装、图书。
这里我们需要满足两个表中的ID的唯一性(可以通过sequence来实现)。
)1.CREATETABLEvpdsample_users(er_nameVARCHAR2(20),er_privilegeNUMBER4.);5.--6.INSERTINTOvpdsample_usersVALUES('Jack',1);7.INSERTINTOvpdsample_usersVALUES('Rose',2);MIT;(这个表存储用户的权限信息,其中的权限即后表vpdsample_privileges中的权限ID字段。
)(这个表存储每个权限ID对应的权限信息,即对哪些对象(服装或图书)有权限。
)第二步,我们要创建一个context(实际上是【context名称空间】)。
可以简单地把context理解为一个定义在内存中的容器,在此容器中我们可以定义若干个键值对,这些键值对可以在一定的范围内被共享(比如同一个session中,或者同一个Oracle实例中)首先,使用system用户登录,赋予创建者相应的权限:grant create any context to user1;然后通过:CREATE OR REPLACE CONTEXT VPD USING pkg_vpdsample ACCESSED GLOBALLY;这里我们创建了一个叫’vpd’的context,’using’后面的是一个PLSQL package的名字,出于安全性考虑,Oracle需要你在创建context时指定一个包名,表示后续对些context 的修改只能通过此包中的存储过程进行修改,不能通过dbms_session.set_context()直接进行修改。
创建context时,package不存在并不会导致编译错误。
最后’accessed globally’是一个可选项,如果未添加此项,表示此context使用范围是某一session;如果指定了此项,则表示该context可以在整个数据库实例范围内共享。
欲删除context同样需要赋予相应的权限:1.grant drop any context to user1;2.drop context VPD;第三步,建立一个package(即上面的pkg_vpdsample),包中的各个函数及存储过程的作用会随后逐一给出:1.CREATEORREPLACEPACKAGEpkg_vpdsample2.IS3.PROCEDUREenable_vpd;4.PROCEDUREdisable_vpd;5.PROCEDUREset_context(p_user_nameINVARCHAR2);6.FUNCTIONgen_vpd_predicate(p_column_nameINVARCHAR2)RETURNVARCHAR2;7.FUNCTIONapply_vpd_clothing(p1invarchar2,p2invarchar2)RETURNVARCHAR2;8.FUNCTIONapply_vpd_books(p1invarchar2,p2invarchar2)RETURNVARCHAR2;9.END;10.11.CREATEORREPLACEPACKAGEBODYpkg_vpdsampleIS12.PROCEDUREenable_vpdIS13.BEGIN14.DBMS_SESSION.set_context(namespace=>'VPD',15.attribute=>'ENABLE',16.value=>'1');17.END;18.19./*======================*/20.PROCEDUREdisable_vpdIS21.BEGIN22.DBMS_SESSION.set_context(namespace=>'VPD',23.attribute=>'ENABLE',24.value=>'0');25.END;26.27./*======================*/28.PROCEDUREset_context(p_user_nameINVARCHAR2)IS29.l_privilegeVARCHAR2(10);30.BEGIN31.SELECTuser_privilege32.INTOl_privilege33.FROMvpdsample_users34.WHEREuser_name=p_user_name;35.DBMS_SESSION.set_identifier(client_id=>l_privilege);36.END;37.38./*======================*/39.FUNCTIONgen_vpd_predicate(p_column_nameINVARCHAR2)RETURNVARCHAR2IS40.l_vpd_flagVARCHAR2(1);41.l_privilegeVARCHAR2(10);42.BEGIN43.l_vpd_flag:=NVL(SYS_CONTEXT('VPD','ENABLE'),'0');44.IFl_vpd_flag=0THEN45.RETURNNULL;46.ELSE47.l_privilege:=SYS_CONTEXT('USERENV','CLIENT_IDENTIFIER');48.IFl_privilegeISNULLTHEN49.RETURN'1=2';50.ELSE51.RETURNp_column_name||'IN(SELECTobject_idFROMvpdsample_privilegesWHEREprivilege_id='||l_privilege||')';52.ENDIF;53.ENDIF;54.END;55.56./*======================*/57.FUNCTIONapply_vpd_clothing(p1invarchar2,p2invarchar2)RETURNVARCHAR2IS58.BEGIN59.RETURNgen_vpd_predicate('clothing_id');60.END;61.62./*======================*/63.FUNCTIONapply_vpd_books(p1invarchar2,p2invarchar2)RETURNVARCHAR2IS64.BEGIN65.RETURNgen_vpd_predicate('book_id');66.END;67.END;enable_vpd,disable_vpd:这两个存储过程用于设置context vpd下的一个自定义属性’enable’,1表是启用vpd,0表禁用vpd,由于我们在创建此context时指定了accessed globally,所以这些属性是可以被跨session访问的。
这两个存储过程调用了dbms_session,因此需要被赋予相应的权限:grant execute on dbms_session to user1;set_context:上面我们提到了context,并且在enable_vpd与disable_vpd中使用了dbms_session.set_context来设置自定义的属性,其实除了这样自定义的context外,Oracle 还提供了预定义的context ’userenv’,该名称空间下有若干预定义的属性,比如’client_identifier’,设置此属性我们不使用set_context,而是使用dbms_session.set_identifier()。
本例中此存储过程根据传入的用户名,查找到该用户的权限ID,并将此ID作为client_identifier保存到context ’userenv’中,以便后续使用。
在实际应用中,此存储过程应该是由外部的应用程序调用的,应用程序可以在登录验证完成后,调用此存储过程写入context。
gen_vpd_predicate:根据传入的字段名称生成一个语法正确的where子句。
这里首先判断了是否启用了vpd,未设置vpd.enable属性的也认为的已经启用了。
随后判断是否已设置userenv.client_identifier属性,如果未设置,则返回一个始终为false的where子句以防止用户查看数据。