【问题标题】:Strategy to snapshot large data set Oracle快照大数据集Oracle的策略
【发布时间】:2020-08-07 12:13:54
【问题描述】:

我的问题:

我有一个应用,登录的用户有一个部门授权列表:

DEPT1, DEPT2, DEPT3, ..., DEPT5000, DEPT5001, ...

大多数用户的个人资料中分配了 5,000 多个部门。

我的任务是编写一个数据模型 + 应用程序代码,该代码将在用户每次登录时“快照”他们的授权部门列表,以便我们可以参考该用户被授权执行的操作(注意:部门 ID 是没有像本例中那样整齐地编号)。

我尝试过的:

我的第一个想法是将部门列表变成一个长的 CSV 字符串,并将其存储为 CLOB:

CREATE TABLE UI_SECURITY_CONFIG (
    SECURITY_CONFIG_ID NUMBER(19,0) NOT NULL,
    DEPTSCSV CLOB NOT NULL
);

每个DEPTSCSV CLOB 都是独一无二的。如果用户与以前登录的其他人具有相同的安全配置文件,它只会选择该安全配置。否则,它将创建一个新行。基本上,选择 DEPTSCSV = 'DEPT1, DEPT2, DEPT3 ...' 如果它不存在,则插入它。但是这种方法失败了,因为一个巨大的字符串(25,000+ 字符)无法比较:

SELECT * FROM UI_SECURITY_CONFIG WHERE DEPTSCSV = 'DEPT0001, DEPT0002, DEPT0003, ..., DEPT5001, DEPT5002'

SQL Error [1704] [42000]: ORA-01704: string literal too long

解决方案尝试 #2:

然后我考虑让 CSV 中的每个项目在表格中成为自己的行:

CREATE TABLE UI_SECURITY_CONFIG (
    SECURITY_CONFIG_ID NUMBER(19,0) NOT NULL,
    DEPTID VARCHAR2(20) NOT NULL
);

INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT0001');
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT0002');
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT0003');
...
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT5001');
INSERT INTO UI_SECURITY_CONFIG(SECURITY_CONFIG_ID, DEPTID) VALUES(1, 'DEPT5002');

但我正在努力编写 SQL 选择,这将是一种有效的匹配算法来查找是否存在与部门列表完全匹配的 SECURITY_CONFIG_ID。

我什至不确定是否有解决此问题的有效方法。

解决方案尝试 #3:

询问堆栈溢出。你会怎么做?

【问题讨论】:

    标签: oracle data-modeling datamodel


    【解决方案1】:

    我能够实现策略 #1。应用程序代码 (Java) 比我的 SQL 客户端 (DBeaver) 使用 PreparedStatement 更好地处理 CLOB 比较:

    String sql = "SELECT SECURITY_CONFIG_ID FROM UI_SECURITY_CONFIG WHERE dbms_lob.compare(DEPTSCSV, ?) = 0";
    
    String DEPTSCSV = "DEPT0001, DEPT0002, ...";
    
    try(PreparedStatement objStmt = objConn.prepareStatement(sql)) {
        Clob clob1 = objConn.createClob();
        clob1.setString(1, DEPTSCSV);
        objStmt.setClob(1, clob1);
    
        ResultSet result = objStmt.executeQuery();
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 2021-02-19
      • 2018-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      相关资源
      最近更新 更多