不允许对虚拟列执行插入操作

Insert operation disallowed on virtual columns

我不明白下面的问题,我在尝试插入查询时遇到错误,因为在虚拟列上不允许插入操作。我在 sql 开发人员中从生产中导出,我尝试 运行 在测试环境中插入这些语句,并且在生产和测试环境中的表中的两个列中都有虚拟列,所以通常不应该有问题同时从生产环境插入到测试环境。但我仍然遇到问题。下面是插入语句之一。但是插入语句有几千条。 ORD_DAYID 列有虚拟列。

Insert into TTRE (IS_GRP,ORD_SRCBK,ORD_MASTER_SRCBK,SALES_ORD_CHNL_SRCID,IS_CAPS,PROD_QTY_UNIT,PROD_U_PRICE,ORD_DAYID,ORD_SRCID,ORDLN_SRCID,ORDMAST_SRCID,ORD_LC_FLAG,PROD_SRCID,PARENT_PROD_SRCID,SYS_DB_NAME,SYS_LOAD_ID,SYS_LOAD_DTS,SYS_REC_SRC,CUST_SRCID,ENTITY_ID,ORD_DT,ORDMAST_DT,CURRENCY,IS_CONSUMPTION_INCLUDED,USER_CODE,WAREHOUSE_DIST_SRCID,IS_PASSED_BY,IS_CAN,PARENT_PROD_QTY,PROD_QTY,PARENT_PROD_U_PRICE,ORDLN_AMT,VAT_AMT,VAT_RATE_CODE,ORDLN_VAT_AMT,REBATE_ORD_AMT,GIFTCARD_ORD_AMT,ORDLN_PROMOTION,IS_INVOICED_FOR_STATISTIC,MAN_PROCESS_FLAG,ORDMAST_USER_CODE,IS_NPASS,ORIGIN,ORD_DTT,ITEM_CAT_CODE,REF_CAMPA_CODE) values (1,'43|14096967','43|14096898',6273,0,-1,0,20160330,13073855,59635337,416412266,-1,0,123076,'LM',358435,to_date('27-DEC-16','DD-MON-RR'),'NESSOFTLM',34118685,43,to_date('30-MAR-16','DD-MON-RR'),to_date('30-MAR-16','DD-MON-RR'),'COP',1,'NNCARDONMA1',4043,1,null,-1,-1,250000,-238095.2381,-11904.7619,'A',-250000,null,null,null,1,null,'NNCARDONMA1',0,29,to_date('30-MAR-16','DD-MON-RR'),null,null); 

似乎没有任何方法可以从生成的插入脚本中自动排除虚拟列,这似乎有点疏忽。

如果您坚持使用当前的脚本,那么您可以编辑该文件以删除列引用和匹配值,这很痛苦;或将数据加载到临时暂存区 table 并仅将非虚拟列复制到真实 table;或临时修改测试环境中的目标 table 以重命名虚拟列并将其替换为非虚拟列,然后您可以将其丢弃,例如像这样:

alter table ttre rename column ord_dayid to ord_dayid_temp;
alter table ttre add ord_dayid number; -- match actual data type
@your_insert_script
alter table ttre drop column ord_dayid;
alter table ttre rename ord_dayid_temp to ord_dayid;

(非常仔细地了解您在做什么,并且您在正确的时间 changing/dropping 做正确的事情,并且您得到了拥有 table 和数据库的任何人的同意. 不要 运行 代码,尤其是破坏性代码,你在互联网上找到的,但并不确定它是否正确 table 和正确...)

但这也很痛苦且容易出错,请注意,插入后的第一个更改将隐式提交。而且您甚至可能没有执行此操作所需的权限。

如果可以重新生成脚本,则可以手动排除虚拟列。在数据库导出向导中,当您到达 'Specify data' window:

输入您的 table 姓名,单击查找按钮,它将在顶部列出您的 table 姓名,select 从该列表中,然后单击向下 -箭。这会将其移动到屏幕的底部,'columns' 条目显示为 *。单击 *,然后单击出现的铅笔符号,这将为您提供一个如下所示的新对话框:

单击加号展开列表以显示所有列,然后取消选中虚拟列。单击确定,然后继续导出。生成的脚本将只包含您勾选的列。


正如@krokodilko 所建议的那样,使用数据泵导出和导入会更简单,但如果您没有这样做的权限,则可能需要让您的 DBA 参与进来。 (而且,当然,确保您实际上被允许将数据从生产环境复制到测试环境——这取决于所涉及的数据类型,这可能不是一个好主意。)

只需删除从其他列派生的列,逻辑上您不需要在该列中插入值,系统将自动为该列派生值并为特定记录插入

当我试图将一个值插入到 computed 列时,这发生在我身上。在 SQL Developer 中,查看 table 架构网格,违规列的 DATA_DEFAULT 列(不是违规列,网格中的列)有一个导出其值的案例语句来自行中的其他值。我从插入语句中删除了有问题的列并且它起作用了。