zoukankan      html  css  js  c++  java
  • MO_GLOBAL

    这是多组织访问的第三篇文章,翻译自Anil PassiMO_GLOBAL-Dive into R12 Multi Org Design

    我希望你已经读了文章 EBS R12 中的 Multi Org . 当我们在思考R12中的 Multi Org 时,总有一些问题会出现在脑海中, 对这些问题最好的分析就是打开包 MO_GLOBAL,别担心你还没有装R12,  MO_GLOBAL在11.5.10 就已经有了, 现在让我们开始吧. 



    在R12中,CLIENT_INFO是如何被替换的呢? 
    我们先来举个例子.
    在R12之前的版本, 你通过以下方法来创建表 PO_HEADERS_ALL
    a. 在PO Schema 上创建一张表, 命名为 PO_HEADERS_ALL
    b. 在APPS schema 上创建一个同义字(synonym) PO_HEADERS_ALL , 指向 PO.PO_HEADERS_ALL
    c. 在APPS schema 上创建视图PO_HEADERS: "select * from po_headers_all where org_id=client_info"

    但是在R12中,下面的事情将会发生:
    a. 在PO Schema 上创建一张表, 命名为 PO_HEADERS_ALL
    b. APPS schema 上创建一个同义字(synonym) PO_HEADERS_ALL , 指向 PO.PO_HEADERS_ALL
    c. 在APPS 中别一个同义字(synonym) 被创建: PO_HEADERS, 指向 PO_HEADERS_ALL
    d. 通过使用 MO_GLOBAL.ORG_SECURITY, 行级别的安全被应用于 PO_HEADERS.
    这个可以通过运行 SQL select * from all_policies where object_name='PO_HEADERS' 来再次确认
    e. 这个策略的影响是无论何时当你访问 PO_HEADERS 时, Oracle RLS 会动态的扩展WHERE 条件语句,如
    SELECT * FROM PO_HEADERS WHERE EXISTS (SELECT 1 FROM mo_glob_org_access_tmp oa WHERE oa.organization_id = org_id) 
    也请参考下面的 **** .


    是否这就意味着,如果我创建一张新的客制化的表,我就要把RLS [ Row Level Security ] 应用在这张表上?
    是的没错, 如果这张表包含着以ORG_ID来区分的数据, 那就应该这样. 在这个例子中你所要做的就是将包里的功能MO_GLOBAL.ORG_SECURITY 赋予那些 表/同义字/视图.


    Multi Org 的RLS[Row Level security]是否也会被应用在 表/同义字/视图 上呢?

    理论上是这样的, RLS 能被应用在以上的任意一个对象中, 但是在实践中,你只会将 RLS 应用在 APPS Schema 中的对象, 这意味着, 你最有可能的就是把RLS应用在同义字上. 基本上, 现在Multi Org 视图已经被受 RLS 保护的同义字替换, 但是, 当访问R12之前版本的Multi-Org安全视图时, 我们不需要修改现有的代码. 现在, 根据ORG_ID来实现数据安全访问的职责依赖于RLS[也被叫作 VPD - Virtual Private Database].


    我已经对我的 Multi Org Security Profile 做了些改变, 方式是通过附加一个新的Org层次, 我还需要运行其它的程序吗?

    就像我们在HRMS中所做的一样, 所建议的是在Security Profiles上做任何改变后, 都运行程序 "Security List Maintenance"


    什么是MO_GLOBAL.INIT
    mo_global.init 的目的 :-
    它会通过检查是否新的Multi Org Security Profile被设置来决定是否有新的  Security Profile 方法被使用.
    如果设置了新的MO security profile, 那么 mo_global.init 会为在 Org Hierarchy 中的每个组织机构插入一条新的记录到表  mo_glob_org_access_tmp 

    mo_global.init 是在何时何地被调用的 ?
    这个方法会在你登录后或者是切换职责后立即被调用. 就像FND_GLOBAL.INITIALIZE 被调用一样, 可以安全的确定 Oracle 会在 FND_GLOBAL.INITIALIZE 之后调用 MO_GLOBAL.INIT


    mo_glob_org_access_tmp 是一张全局临时表(global temporary table)吗?
    是的, 当在你session中的Multi Org初始化之后, 表 mo_glob_org_access_tmp 中, 你的 session 会有 X 条记录 . X 表示的是被赋予 MO Security Profile 的组织机构的数量 [在 security profile 中查看组织层次或者组织列表]


    MO_GLOBAL.ORG_SECURITY 的目的是什么 ?
    Row-Level-Security 的目的是隐藏某些数据[基于一些条件]. RLS 是通过扩展安全对象上的where条件语句来实现的.
    1. MO_GLOBAL.ORG_SECURITY 的功能是返回WHERE条件语句
    2. 这个where 条件语句会被扩展到那些已经启用Multi Org行级别安全的 表/同义字/视图 


    MO_GLOBAL.SET_POLICY_CONTEXT 的目的是什么?
    这个 procedure 有两个参数
        p_access_mode
              当你想让你当前的session只会对一个ORG_ID工作时, 输入"S"
              当你想让你当前的session只会对多个ORG_ID工作时, 输入"M"
        p_org_id
              只有当p_access_mode的值是"S"时才需要


    在SQL*Plus中,我想对一个指定的Org[单个Org]设置session, 在R12中我该如何做呢?
    SQL>> exec MO_GLOBAL.SET_POLICY_CONTEXT('S',101);
    在上面的例子中, ORG_ID 101 会被赋予你当前的session.
    在其内部, 当你对你的单个org设置上下文(Context)时,这段 蓝色 的代码将会被执行: dbms_session.set_context('multi_org2', 'current_org_id', 101);


    **** 如果当前的数据库session被初始化为单个Org[如上面的步骤], 那么在行级别安全(Row-Level-Security)上扩展到对象的 Where 语句就会是
    WHERE org_id = sys_context('multi_org2','current_org_id')


    为什么我作为一个应用程序技术人员会使用 MO_GLOBAL.SET_POLICY_CONTEXT 呢?

    我们假设你想在ORG_ID为101下通过调用API来创建invoice, 但是这个API又没有Org_id的参数,那么你可以这样做:

    a. e执行 MO_GLOBAL.SET_POLICY_CONTEXT('S',101)
    b. 调用 Invoice API, 这将会在其内部从当前的MO上下文(Context)中读取ORG_ID.


    在SQL*Plus中,我想模拟一次登录到指定的职责上,我该如何做?
    a. 调用 FND_GLOBAL.INITIALIZE
    这将会设置你的职责ID,用户ID等等(responsibility id, user_id)
    b. 调用 MO_GLOBAL.INIT

    这将会你的的职责/用户中读取 MO配置选项的值,并且初始化多组织访问(Multi Org Access).

  • 相关阅读:
    Druid 使用 Kafka 将数据载入到 Kafka
    Druid 使用 Kafka 数据加载教程——下载和启动 Kafka
    Druid 集群方式部署 —— 启动服务
    Druid 集群方式部署 —— 端口调整
    Druid 集群方式部署 —— 配置调整
    Druid 集群方式部署 —— 配置 Zookeeper 连接
    Druid 集群方式部署 —— 元数据和深度存储
    Druid 集群方式部署 —— 从独立服务器部署上合并到集群的硬件配置
    Druid 集群方式部署 —— 选择硬件
    Druid 独立服务器方式部署文档
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299284.html
Copyright © 2011-2022 走看看