共计 3684 个字符,预计需要花费 10 分钟才能阅读完成。
这篇文章主要为大家展示了“Oracle 12.2 中如何联机重定义使用 VPD 策略的表”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让丸趣 TV 小编带领大家一起研究并学习一下“Oracle 12.2 中如何联机重定义使用 VPD 策略的表”这篇文章吧。
原始表 jy.employees 的创建语句如下:
SQL create table jy.employees( 2 employee_id number(6) primary key,
3 first_name varchar2(20),
4 last_name varchar2(25)
5 constraint emp_last_name_nn not null,
6 email varchar2(25) constraint emp_email_nn not null,
7 phone_number varchar2(20),
8 hire_date date constraint emp_hire_date_nn not null,
9 job_id varchar2(10) constraint emp_job_nn not null,
10 salary number(8,2),
11 commission_pct number(2,2),
12 manager_id number(6),
13 department_id number(4),
14 constraint emp_salary_min check (salary 0),
15 constraint emp_email_uk unique (email)
16 );
Table created.
使用下面的 jy.auth_emp_dep_100 函数来创建 VPD 策略
SQL create or replace function jy.auth_emp_dep_100(
2 schema_var in varchar2,
3 table_var in varchar2
4 )
5 return varchar2
6 as
7 return_val varchar2 (400);
8 unm varchar2(30);
9 begin
10 select user into unm from dual;
11 if (unm = jy) then
12 return_val := null;
13 else
14 return_val := department_id = 100
15 end if;
16 return return_val;
17 end auth_emp_dep_100;
18 /
Function created.
执行 dbms_rls_add_policy 过程来对原始表 jy.employees 表使用 jy.auth_emp_dep_100 函数来指定 VPD 策略
SQL begin
2 dbms_rls.add_policy(
3 object_schema = jy ,
4 object_name = employees ,
5 policy_name = employees_policy ,
6 function_schema = jy ,
7 policy_function = auth_emp_dep_100
8 end;
9 /
PL/SQL procedure successfully completed.
在这个例子中,表 jy.employees 表重定义后将会禁用所有的触发器。注意重定义将不会修改列名或数据类型。因此在执行 start_refef_table 过程时 copy_vpd_opt 参数设置为 dbms_redefinition.cons_vpd_auto。
1. 用要执行联机重定义操作的用户登录数据库
SQL conn jy/jy@jypdb
Connected.
2. 验证原始表是否可以执行联机重定义
SQL begin
2 dbms_redefinition.can_redef_table(hr , employees ,DBMS_REDEFINITION.CONS_USE_PK);
3 end;
4 /
PL/SQL procedure successfully completed.
3. 创建中间表 jy.int_employees
SQL create table jy.int_employees( 2 employee_id number(6),
3 first_name varchar2(20),
4 last_name varchar2(25),
5 email varchar2(25),
6 phone_number varchar2(20),
7 hire_date date,
8 job_id varchar2(10),
9 salary number(8,2),
10 commission_pct number(2,2),
11 manager_id number(6),
12 department_id number(4));
Table created.
4. 开始联机重定义操作
SQL begin
2 dbms_redefinition.start_redef_table(
3 uname = jy ,
4 orig_table = employees ,
5 int_table = int_employees ,
6 col_mapping = NULL,
7 options_flag = DBMS_REDEFINITION.CONS_USE_PK,
8 orderby_cols = NULL,
9 part_name = NULL,
10 copy_vpd_opt = DBMS_REDEFINITION.CONS_VPD_AUTO);
11 end;
12 /
PL/SQL procedure successfully completed.
当 copy_vpd_opt 参数被设置为 dbms_redefinition.cons_vpd_auto 时,只有表的所有者与调用联机重定义操作的用户可以在联机重定义期间访问该表。col_mapping 参数设置为 NULL。当 copy_vpd_opt 参数设置为 dbms_redefinition.cons_vpd_auto 时,col_mapping 参数必须设置为 NULL 或 *。
5. 复制依赖对象
SQL declare
2 num_errors pls_integer;
3 begin
4 dbms_redefinition.copy_table_dependents(
5 uname = jy ,
6 orig_table = employees ,
7 int_table = int_employees ,
8 copy_indexes = DBMS_REDEFINITION.CONS_ORIG_PARAMS,
9 copy_triggers = TRUE,
10 copy_constraints = TRUE,
11 copy_privileges = TRUE,
12 ignore_errors = FALSE,
13 num_errors = num_errors);
14 end;
15 /
PL/SQL procedure successfully completed.
6. 对中间表禁用所有的触发器
SQL alter table jy.int_employees disable all triggers;
Table altered.
7. 可选操作同步中间表
SQL begin
2 dbms_redefinition.sync_interim_table(
3 uname = jy ,
4 orig_table = employees ,
5 int_table = int_employees
6 end;
7 /
PL/SQL procedure successfully completed.
8. 完成联机重定义操作
SQL begin
2 dbms_redefinition.finish_redef_table(
3 uname = jy ,
4 orig_table = employees ,
5 int_table = int_employees
6 end;
7 /
PL/SQL procedure successfully completed.
9. 等待任何查询中间表的语句执行完成后将其删除
SQL drop table jy.int_employees;
Table dropped
到此重定义操作就完成了。
以上是“Oracle 12.2 中如何联机重定义使用 VPD 策略的表”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注丸趣 TV 行业资讯频道!