Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向数据库表动态添加列?_Java_Database_Oracle_Database Design - Fatal编程技术网

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

Java 向数据库表动态添加列?,java,database,oracle,database-design,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|

我正在使用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
添加一个调用“altertable”指令的botton似乎很容易,但我不想给用户这种权限。我正在考虑在另一个表中将每个列表示为行,并使用Java进程在UI中构建该表

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

“我遇到的另一个不相关的问题是:表中的数据会影响 直接进行计算,如果添加了任何列,则计算必须 考虑新的列/列。 你的意思是“另一个完全相关的问题是……”。因为这一声明强调了你提议实施的深远影响。动态添加一个列很容易

困难之处在于同时需要对代码库进行影响分析,并评估引用该表的所有SQL。毕竟,在计算中包含新列是不够的。可能还有其他选择需要修改(例如,报告)。当然,您需要将数据放入新列中,这意味着要修改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;

您可以授予用户在此过程上的执行权限,而不授予他们在基础表上更广泛的权限

你确定需要一个新专栏吗?对我来说,这似乎是一个糟糕的设计。为什么不让一个表有三列,Id、Tax和ValueOfTax。这样,您就可以将所有信息存储在一个表中,而无需更改模式?用户需要能够添加新的税值,但技术实现仍然留给您。需求符合性测试永远不应该依赖于实现手段。我想不出有哪种情况需要用户在数据库中创建新列。我可以想象DBA们会拔掉他们的头发!您的数据模型中有一个很大的缺陷。而是解决这个问题。从长远来看,你会更快乐。这就是为什么当“用户需求”文档必须包含模式设计时,我会退缩的原因。