Oracle12.2怎么修改表的列名
这篇文章主要介绍“Oracle12.2怎么修改表的列名”,在日常操作中,相信很多人在Oracle12.2怎么修改表的列名问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle12.2怎么修改表的列名”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
下面的例子将演示联机重定义使用VPD策略的表,并修改表中的一个列名,原始表jy.orders的创建语句如下:
SQL>createtablejy.orders(2order_idnumber(12)primarykey,3order_datetimestampwithlocaltimezoneconstraintorder_date_nnnotnull,4order_modevarchar2(8),5customer_idnumber(6)constraintorder_customer_id_nnnotnull,6order_statusnumber(2),7order_totalnumber(8,2),8sales_rep_idnumber(6),9promotion_idnumber(6),10constraintorder_mode_lov11check(order_modein('direct','online')),12constraintorder_total_min13check(order_total>=0));Tablecreated.
创建下面的jy.auth_orders函数来创建VPD策略
SQL>createorreplacefunctionjy.auth_orders(2schema_varinvarchar2,3table_varinvarchar24)5returnvarchar26as7return_valvarchar2(400);8unmvarchar2(30);9begin10selectuserintounmfromdual;11if(unm='jy')then12return_val:=null;13else14return_val:='sales_rep_id=159';15endif;16returnreturn_val;17endauth_orders;18/Functioncreated.
下面执行dbms_rls.add_policy过程来使用jy.auth_orders函数来给原始表jy.orders指定VPD策略:
SQL>begin2dbms_rls.add_policy(3object_schema=>'jy',4object_name=>'orders',5policy_name=>'orders_policy',6function_schema=>'jy',7policy_function=>'auth_orders');8end;9/PL/SQLproceduresuccessfullycompleted.
在这个例子中,被重定义后表中的sales_rep_id列被修改为sale_pid。当在执行重定义过程如可修改一个或多个列或列的数据类型,那么在start_refef_table过程中对于copy_vpd_opt参数必须指定dbms_redefinition.cons_vpd_manual。
1.用要执行联机重定义操作的用户登录数据库
SQL>connjy/jy@jypdbConnected.
2.验证原始表是否可以执行联机重定义
SQL>begin2dbms_redefinition.can_redef_table(3uname=>'jy',4tname=>'orders',5options_flag=>DBMS_REDEFINITION.CONS_USE_PK);6end;7/PL/SQLproceduresuccessfullycompleted.
3.创建中间表
SQL>createtablejy.int_orders(2order_idnumber(12),3order_datetimestampwithlocaltimezone,4order_modevarchar2(8),5customer_idnumber(6),6order_statusnumber(2),7order_totalnumber(8,2),8sales_pidnumber(6),9promotion_idnumber(6));Tablecreated.
注意,在中间表中sales_rep_id列被修改为sales_pid。
4.开始联机重定义操作
SQL>begin2dbms_redefinition.start_redef_table(3uname=>'jy',4orig_table=>'orders',5int_table=>'int_orders',6col_mapping=>'order_idorder_id,order_dateorder_date,order_mode7order_mode,customer_idcustomer_id,order_status8order_status,order_totalorder_total,sales_rep_id9sales_pid,promotion_idpromotion_id',10options_flag=>dbms_redefinition.cons_use_pk,11orderby_cols=>null,12part_name=>null,13copy_vpd_opt=>dbms_redefinition.cons_vpd_manual);14end;15/PL/SQLproceduresuccessfullycompleted.
因为原始表与中间表存在不同的列名,那么copy_vpd_opt参数必须设置为dbms_redefinition.cons_vpd_manual。
5.对中间表创建VPD策略
5.1创建一个名为jy.auth_orders_sales_pid的函数来创建VPD策略,这里使用sales_pid列来代替sales_rep_id列。
SQL>createorreplacefunctionjy.auth_orders_sales_pid(2schema_varinvarchar2,3table_varinvarchar24)5returnvarchar26as7return_valvarchar2(400);8unmvarchar2(30);9begin10selectuserintounmfromdual;11if(unm='jy')then12return_val:=null;13else14return_val:='sales_pid=159';15endif;16returnreturn_val;17endauth_orders_sales_pid;18/Functioncreated.
5.2执行dbms_rls.add_policy过程来使用jy.auth_orders_sales_pid函数来为中间表增加VPD策略
SQL>begin2dbms_rls.add_policy(3object_schema=>'jy',4object_name=>'int_orders',5policy_name=>'orders_policy',6function_schema=>'jy',7policy_function=>'auth_orders_sales_pid');8end;9/PL/SQLproceduresuccessfullycompleted.
6.复制依赖对象
SQL>declare2num_errorspls_integer;3begin4dbms_redefinition.copy_table_dependents(5uname=>'jy',6orig_table=>'orders',7int_table=>'int_orders',8copy_indexes=>dbms_redefinition.cons_orig_params,9copy_triggers=>true,10copy_constraints=>true,11copy_privileges=>true,12ignore_errors=>true,13num_errors=>num_errors);14end;15/PL/SQLproceduresuccessfullycompleted.
注意在这里ignore_errors参数被设置为true。原因是因为原始表对于列sales_rep_id存在索引与约束,并且在中间表中列被修改为sales_pid。
7.查询dba_redefinition_errors视图来检查是否存在错误
SQL>setlong8000SQL>setpages8000SQL>columnobject_nameheading'objectname'formata20SQL>columnbase_table_nameheading'basetablename'formata10SQL>columnddl_txtheading'ddlthatcausederror'formata40SQL>selectobject_name,base_table_name,ddl_txtfromdba_redefinition_errors;norowsselected
8.可选操作同中间表
SQL>begin2dbms_redefinition.sync_interim_table(3uname=>'jy',4orig_table=>'orders',5int_table=>'int_orders');6end;7/PL/SQLproceduresuccessfullycompleted.
9.完成联机重定义操作
SQL>begin2dbms_redefinition.finish_redef_table(3uname=>'jy',4orig_table=>'orders',5int_table=>'int_orders');6end;7/PL/SQLproceduresuccessfullycompleted.SQL>descjy.ordersNameTypeNullableDefaultComments--------------------------------------------------------------------ORDER_IDNUMBER(12)ORDER_DATETIMESTAMP(6)WITHLOCALTIMEZONEORDER_MODEVARCHAR2(8)YCUSTOMER_IDNUMBER(6)ORDER_STATUSNUMBER(2)YORDER_TOTALNUMBER(8,2)YSALES_PIDNUMBER(6)YPROMOTION_IDNUMBER(6)Y
10.等待任何查询中间表的语句执行完成后将其删除
SQL>droptablejy.int_orders;Tabledropped
到此重定义操作就完成了。
到此,关于“Oracle12.2怎么修改表的列名”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。