0

我正在使用 Java EE、Oracle db 和 JPA:

我需要在 oracle 中创建一个公用表。它可以使用 ui 进行编辑,例如:

id|tax1|tax2|tax3
------------------
1 | 5  |  16|  9
2 | 7  |  1 |  8

用户必须能够添加新列;上一张表必须如下所示:

id|tax1|tax2|tax3|tax4    (the tax4 column was added)
-----------------------
1 | 5  |  16|  9 |  0
2 | 7  |  1 |  8 |  0

添加一个调用“更改表”指令的按钮似乎很容易,但我不想给用户这种权限。我正在考虑将每一列表示为另一个表中的行,并使用 Java 进程在 UI 中构建表。

我遇到的另一个不相关的问题是:表中的数据直接影响计算,如果添加任何列,计算必须考虑新列/列。

4

1 回答 1

2

“我遇到的另一个不相关的问题是:表中的数据直接影响计算,如果添加任何列,计算必须考虑新列/列。”

你的意思是“另一个完全相关的问题是......”。因为此声明突出了您提议的实施的深远影响。动态添加一列很容易。

困难的一点是伴随需要对代码库进行影响分析并评估引用该表的所有 SQL。毕竟,将新列包含在该计算中是不够的。可能还有其他 SELECT 需要修改(例如,报告)。当然,您需要将数据放入新列,这意味着要修改 UPDATE 和 INSERT 语句。这种事情对于一个负责的人来说已经够难的了。编写动态 SQL 来自动完成?疯狂。

我希望你不要为任何负责我自己的税务事务的组织写申请。

无论如何,您的问题源于将新数据视为结构变化,而不是它是什么,内容变化。很明显,声明为您的表具有重复列(TAX1、TAX2、TAX3),是不良数据模型的一部分,需要进一步规范化。

确实,这可能会使您的税收计算更加复杂,但这是一件好事。复杂性应该在业务规则实现而不是数据模型中。至少通过这种方式,复杂性被限制在单个程序单元中,而不是分散在应用程序的 CRUD 功能中。


为了完整起见,这里是通往疯狂山脉的路径:

create or replace procedure add_new_col as
    n pls_integer;
begin
    select count(*) into n
    from user_tab_columns
    where table_name = 'YOUR_TABLE'
    and column_name like 'TAX%'; 

    execute immediate 'alter table your_table add tax'||trim(to_char(n+1))||' number';
end;

您可以授予用户对此过程的执行权限,而无需授予他们对基础表的更广泛的权限。

于 2013-06-14T03:50:21.370 回答