java - 动态向数据库表添加列?

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

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

最佳答案

"Another unrelated problem I have is: the data in the table affects directly a calculation, if any column is added, the calculation must consider the new column/columns."

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

困难之处在于同时需要对代码库进行影响分析并评估引用该表的所有 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;

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

关于java - 动态向数据库表添加列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17098032/

相关文章:

java - 当我使用套接字通过本地网络传输文件时,如何防止文件损坏?

java - 泛型和可变参数 java

java - 我应该使用生产代码中的 DAO 来设置和验证测试吗?

sql - Oracle left join 表现得像 inner join

java - Android JCIFS 建立 session 失败

java - FTPClient 无法打开文件,没有那个文件或目录

数据库灵活性和隐私、隐藏结构、软件兼容性和 'public' 权限

Django 用户名字不是必需的,但在数据库中有 NOT NULL 约束

mysql - Oracle中mysql的系统变量相当于什么?

oracle - 在 Linux 的 Windows 子系统上安装 Oracle Instant Client