Oracle 12.2 聯機重定義使用VPD策略的表並不修改表的任何列
下面的例子將演示如何聯機重定義使用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
到此重定義操作就完成了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2142203/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 12.2 聯機重定義使用VPD策略的表並修改表的列名Oracle
- Oracle 12.2 聯機重定義多個分割槽並將其移動到不同的表空間中Oracle
- Oracle使用聯機重定義來給表增加新列與分割槽Oracle
- Oracle 12.2使用物件資料型別來重定義表Oracle物件資料型別
- Oracle 12.2 使用聯機重定義對錶進行多處改變Oracle
- Oracle表的線上重定義(一)Oracle
- oracle 表線上重定義Oracle
- oracle表線上重定義Oracle
- 【Oracle】線上重定義表Oracle
- Oracle 12.2使用dbms_redefinition.redef_table過程來重定義表的儲存屬性Oracle
- Oracle中重建表的線上重定義Oracle
- 使用ORACLE線上重定義將普通表改為分割槽表Oracle
- ORACLE 線上重新定義表分割槽表重定義為普通表。Oracle
- 12c OCP題庫解析060-2 對配置了VPD策略的表進行線上重定義
- oracle線上重定義表步驟Oracle
- Oracle 12.2使用手動建立與註冊依賴物件來執行聯機重定義Oracle物件
- 線上重定義表ORACLE 11GOracle
- 【Oracle】利用線上重定義的方式改變普通表為分割槽表Oracle
- oracle修改表增加列刪除列修改列Oracle
- 【TABLE】oracle表線上重定義注意事項Oracle
- oracle實驗記錄 (線上重定義表)Oracle
- 使用DBMS_REDEFINITION線上重定義表普通表為分割槽表
- 資料庫表的線上重定義資料庫
- 在oracle 9i下線上重定義表Oracle
- 使用線上重定義方法改造普通表為分割槽表實戰
- dbms_redefinition線上重定義表
- OCM實驗-使用線上重定義方式遷移表
- oracle分割槽表線上重定義欄位not null問題OracleNull
- ORACLE 普通錶轉換成分割槽表(線上重定義)Oracle
- 巢狀表在表定義中的使用:一個例子巢狀
- Oracle批次修改使用者表table的表空間Oracle
- 利用DBMS_REDEFINITION線上重定義表
- 聯機重定義修改欄位型別(NVARCHAR2->VARCHAR2)型別
- 分割槽表和dbms_redefinition包線上重定義表
- ORACLE 普通錶轉換成分割槽表(線上重定義)(zt)Oracle
- Oracle的線上重定義(轉)Oracle
- Oracle普通表修改為分割槽表的方法Oracle
- 兩表聯查修改的sql語句SQL