我正在使用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
添加一个调用“alter table”指令的botton似乎很容易,但我不想给用户那种权限。我正在考虑将每个列表示为另一个表中的行,并使用Java进程在UI中构建表。
我遇到的另一个不相关的问题是:表中的数据会直接影响计算,如果添加了任何列,则计算必须考虑新的列/列。
答案 0 :(得分: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;
您可以授予用户对此过程的执行权限,而无需授予他们对基础表的更广泛权限。