SQL动态条件掩码操纵HAVING子句

时间:2016-10-13 17:29:59

标签: oracle jdbc dynamic masking

我的任务是受到动​​态屏蔽的要求。 与大多数动态屏蔽要求不同的是,生成的SQL必须使用HAVING子句而不是WHERE子句进行屏蔽。至少这是我学习的内容。

具体做法是: 必须满足几条规则,但我使用两条规则进行试点开发和研究。他们是:

  1. 任何包含少于3家公司价值的汇总都无法显示。
  2. 任何包含来自任何特定公司的总额超过95%的贡献的任何汇总都无法显示
  3. 必须容纳从此数据库检索数据的所有系统。示例是MicroStrategy v10平台和提交标准查询的自定义平台(仅显示提出请求的平台的广泛差异)
  4. 理想情况下,我会显示数据行,但只会屏蔽敏感列中的值。但是,根据我目前的发现,我会接受过滤行。

    环境

    • Oracle 11g Fusion
    • 战略愿景是转向除Oracle之外的其他东西,例如Hadoop

    同样,有更多的规则,但让我们从那些开始。 如果我考虑这样一个简单的查询:(本帖末尾的样本数据)

    select
        Time_Wk, Category, Brand, sum( Value_Sales )
    from
        clientData
    group by
        Time_Wk, Category, Brand
    

    我需要应用上面的掩码规则并更改SQL以包含一个HAVING子句,这将导致以下SQL

    select
       Time_Wk, Category, Brand, sum( Value_Sales )
    from
       clientData
    group by
       Time_Wk, Category, Brand
    having
        count( distinct Retailer ) > 2
        and ( sum( Sensitive_Sales ) / sum( Value_Sales * 1.0 ) ) < .95
    

    这当然没有考虑使用连接或已经使用HAVING子句的更复杂查询。宝贝步骤。

    这是我到目前为止所考虑的以及我的发现:

    1. Oracle VPD
      • 这很有希望,直到我意识到我必须实现一个HAVING子句。到目前为止,我还没有找到任何表明操纵HAVING子句的工作。处理允许我测试的设置。
      • 任何人都可以用这种或那种方式确认我可以用Oracle VPD操纵HAVING子句吗?
    2. Oracle API
      • 我读过有关API用户挂钩的信息,但似乎这些只在Oracle HRMS中可用。
      • 是否有人知道在非HRMS安装中是否可以访问Oracle API挂钩?
    3. JDBC
      • 考虑在JDBC驱动程序中使用代码来解析SQL语句并相应地操作HAVING子句。
      • 这还需要对数据库进行额外查询才能获取参数(可能只在启动时才会考虑设计)
      • 不熟悉JDBC代码并积极研究它。
      • 任何人都可以确认这是可能的吗?
      • 我可以参考哪些代码示例?
    4. 第三方解决方案
      • 我目前正在关注Hexatier。虽然基于与团队的初步讨论,但我并不乐观。我有一个演示来考虑这些要求。
      • 有关其他第三方解决方案的建议吗?
    5. 提前感谢您查看此帖子以及您可能提供的任何信息。非常感谢。

      示例数据,如果您真的对使用此场景感兴趣

      DROP TABLE IF EXISTS clientData;
      CREATE TABLE IF NOT EXISTS clientData(
         Time_wk         INTEGER  NOT NULL
        ,Category        VARCHAR(4)
        ,Brand           VARCHAR(5)
        ,Retailer        VARCHAR(8)
        ,Value_Sales     INTEGER 
        ,Senstivity_Flag INTEGER 
        ,Sensitive_Sales INTEGER 
        ,PRIMARY KEY(Time_wk,Category,Brand,Retailer)
      );
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Coke','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Coke','NonSens5',200,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Coke','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Coke','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Coke','NonSens6',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Pepsi','Sens1',25,1,25);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Pepsi','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (1,'Cola','Pepsi','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (2,'Cola','Coke','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (2,'Cola','Coke','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (2,'Cola','Coke','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (2,'Cola','Pepsi','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (2,'Cola','Pepsi','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (2,'Cola','Pepsi','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Coke','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Coke','Nonsens4',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Coke','Nonsens5',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Coke','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Coke','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Pepsi','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Pepsi','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (3,'Cola','Pepsi','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (4,'Cola','Coke','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (4,'Cola','Coke','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (4,'Cola','Coke','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (4,'Cola','Pepsi','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (4,'Cola','Pepsi','Sens1',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (4,'Cola','Pepsi','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (5,'Cola','Coke','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (5,'Cola','Coke','Sens1',0,1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (5,'Cola','Coke','Sens2',0,1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (5,'Cola','Pepsi','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (5,'Cola','Pepsi','Sens2',100,1,100);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (6,'Cola','Coke','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (6,'Cola','Pepsi','NonSens3',100,-1,0);
      INSERT INTO clientData(Time_wk,Category,Brand,Retailer,Value_Sales,Senstivity_Flag,Sensitive_Sales) VALUES (6,'Cola','Pepsi','Sens2',100,1,100);
      

0 个答案:

没有答案