这篇文章主要为大家展示了“Oracle 12.2中如何联机重定义使用VPD策略的表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Oracle 12.2中如何联机重定义使用VPD策略的表”这篇文章吧。

原始表jy.employees的创建语句如下:

SQL>createtablejy.employees(2employee_idnumber(6)primarykey,3first_namevarchar2(20),4last_namevarchar2(25)5constraintemp_last_name_nnnotnull,6emailvarchar2(25)constraintemp_email_nnnotnull,7phone_numbervarchar2(20),8hire_datedateconstraintemp_hire_date_nnnotnull,9job_idvarchar2(10)constraintemp_job_nnnotnull,10salarynumber(8,2),11commission_pctnumber(2,2),12manager_idnumber(6),13department_idnumber(4),14constraintemp_salary_mincheck(salary>0),15constraintemp_email_ukunique(email)16);Tablecreated.

使用下面的jy.auth_emp_dep_100函数来创建VPD策略

SQL>createorreplacefunctionjy.auth_emp_dep_100(2schema_varinvarchar2,3table_varinvarchar24)5returnvarchar26as7return_valvarchar2(400);8unmvarchar2(30);9begin10selectuserintounmfromdual;11if(unm='jy')then12return_val:=null;13else14return_val:='department_id=100';15endif;16returnreturn_val;17endauth_emp_dep_100;18/Functioncreated.

执行dbms_rls_add_policy过程来对原始表jy.employees表使用jy.auth_emp_dep_100函数来指定VPD策略

SQL>begin2dbms_rls.add_policy(3object_schema=>'jy',4object_name=>'employees',5policy_name=>'employees_policy',6function_schema=>'jy',7policy_function=>'auth_emp_dep_100');8end;9/PL/SQLproceduresuccessfullycompleted.

在这个例子中,表jy.employees表重定义后将会禁用所有的触发器。注意重定义将不会修改列名或数据类型。因此在执行start_refef_table过程时copy_vpd_opt参数设置为dbms_redefinition.cons_vpd_auto。

1.用要执行联机重定义操作的用户登录数据库

SQL>connjy/jy@jypdbConnected.

2.验证原始表是否可以执行联机重定义

SQL>begin2dbms_redefinition.can_redef_table('hr','employees',DBMS_REDEFINITION.CONS_USE_PK);3end;4/PL/SQLproceduresuccessfullycompleted.

3.创建中间表jy.int_employees

SQL>createtablejy.int_employees(2employee_idnumber(6),3first_namevarchar2(20),4last_namevarchar2(25),5emailvarchar2(25),6phone_numbervarchar2(20),7hire_datedate,8job_idvarchar2(10),9salarynumber(8,2),10commission_pctnumber(2,2),11manager_idnumber(6),12department_idnumber(4));Tablecreated.

4.开始联机重定义操作

SQL>begin2dbms_redefinition.start_redef_table(3uname=>'jy',4orig_table=>'employees',5int_table=>'int_employees',6col_mapping=>NULL,7options_flag=>DBMS_REDEFINITION.CONS_USE_PK,8orderby_cols=>NULL,9part_name=>NULL,10copy_vpd_opt=>DBMS_REDEFINITION.CONS_VPD_AUTO);11end;12/PL/SQLproceduresuccessfullycompleted.

当copy_vpd_opt参数被设置为dbms_redefinition.cons_vpd_auto时,只有表的所有者与调用联机重定义操作的用户可以在联机重定义期间访问该表。col_mapping参数设置为NULL。当copy_vpd_opt参数设置为dbms_redefinition.cons_vpd_auto时,col_mapping参数必须设置为NULL或'*'。

5.复制依赖对象

SQL>declare2num_errorspls_integer;3begin4dbms_redefinition.copy_table_dependents(5uname=>'jy',6orig_table=>'employees',7int_table=>'int_employees',8copy_indexes=>DBMS_REDEFINITION.CONS_ORIG_PARAMS,9copy_triggers=>TRUE,10copy_constraints=>TRUE,11copy_privileges=>TRUE,12ignore_errors=>FALSE,13num_errors=>num_errors);14end;15/PL/SQLproceduresuccessfullycompleted.

6.对中间表禁用所有的触发器

SQL>altertablejy.int_employeesdisablealltriggers;Tablealtered.

7.可选操作同步中间表

SQL>begin2dbms_redefinition.sync_interim_table(3uname=>'jy',4orig_table=>'employees',5int_table=>'int_employees');6end;7/PL/SQLproceduresuccessfullycompleted.

8.完成联机重定义操作

SQL>begin2dbms_redefinition.finish_redef_table(3uname=>'jy',4orig_table=>'employees',5int_table=>'int_employees');6end;7/PL/SQLproceduresuccessfullycompleted.

9.等待任何查询中间表的语句执行完成后将其删除

SQL>droptablejy.int_employees;Tabledropped

到此重定义操作就完成了。

以上是“Oracle 12.2中如何联机重定义使用VPD策略的表”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!