动态地向数据库表添加列?

时间:2013-06-13 22:11:47

标签: java database oracle database-design

我正在使用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中构建表。

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

1 个答案:

答案 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;

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