Oracle 12.2 聯機重定義使用VPD策略的表並修改表的列名
下面的例子將演示聯機重定義使用VPD策略的表,並修改表中的一個列名,原始表jy.orders的建立語句如下:
SQL> create table jy.orders( 2 order_id number(12) primary key, 3 order_date timestamp with local time zone constraint order_date_nn not null, 4 order_mode varchar2(8), 5 customer_id number(6) constraint order_customer_id_nn not null, 6 order_status number(2), 7 order_total number(8,2), 8 sales_rep_id number(6), 9 promotion_id number(6), 10 constraint order_mode_lov 11 check (order_mode in ('direct','online')), 12 constraint order_total_min 13 check (order_total >= 0)); Table created.
建立下面的jy.auth_orders函式來建立VPD策略
SQL> create or replace function jy.auth_orders( 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 := 'sales_rep_id = 159'; 15 end if; 16 return return_val; 17 end auth_orders; 18 / Function created.
下面執行dbms_rls.add_policy過程來使用jy.auth_orders函式來給原始表jy.orders指定VPD策略:
SQL> begin 2 dbms_rls.add_policy( 3 object_schema => 'jy', 4 object_name => 'orders', 5 policy_name => 'orders_policy', 6 function_schema => 'jy', 7 policy_function => 'auth_orders'); 8 end; 9 / PL/SQL procedure successfully completed.
在這個例子中,被重定義後表中的sales_rep_id列被修改為sale_pid。當在執行重定義過程如可修改一個或多個列或列的資料型別,那麼在start_refef_table過程中對於copy_vpd_opt引數必須指定dbms_redefinition.cons_vpd_manual。
1.用要執行聯機重定義操作的使用者登入資料庫
SQL> conn jy/jy@jypdb Connected.
2.驗證原始表是否可以執行聯機重定義
SQL> begin 2 dbms_redefinition.can_redef_table( 3 uname => 'jy', 4 tname => 'orders', 5 options_flag => DBMS_REDEFINITION.CONS_USE_PK); 6 end; 7 / PL/SQL procedure successfully completed.
3.建立中間表
SQL> create table jy.int_orders( 2 order_id number(12), 3 order_date timestamp with local time zone, 4 order_mode varchar2(8), 5 customer_id number(6), 6 order_status number(2), 7 order_total number(8,2), 8 sales_pid number(6), 9 promotion_id number(6)); Table created.
注意,在中間表中sales_rep_id列被修改為sales_pid。
4.開始聯機重定義操作
SQL> begin 2 dbms_redefinition.start_redef_table ( 3 uname => 'jy', 4 orig_table => 'orders', 5 int_table => 'int_orders', 6 col_mapping => 'order_id order_id, order_date order_date, order_mode 7 order_mode, customer_id customer_id, order_status 8 order_status, order_total order_total, sales_rep_id 9 sales_pid, promotion_id promotion_id', 10 options_flag => dbms_redefinition.cons_use_pk, 11 orderby_cols => null, 12 part_name => null, 13 copy_vpd_opt => dbms_redefinition.cons_vpd_manual); 14 end; 15 / PL/SQL procedure successfully completed.
因為原始表與中間表存在不同的列名,那麼copy_vpd_opt引數必須設定為dbms_redefinition.cons_vpd_manual。
5.對中間表建立VPD策略
5.1建立一個名為jy.auth_orders_sales_pid的函式來建立VPD策略,這裡使用sales_pid列來代替sales_rep_id列。
SQL> create or replace function jy.auth_orders_sales_pid( 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 := 'sales_pid = 159'; 15 end if; 16 return return_val; 17 end auth_orders_sales_pid; 18 / Function created.
5.2執行dbms_rls.add_policy過程來使用jy.auth_orders_sales_pid函式來為中間表增加VPD策略
SQL> begin 2 dbms_rls.add_policy ( 3 object_schema => 'jy', 4 object_name => 'int_orders', 5 policy_name => 'orders_policy', 6 function_schema => 'jy', 7 policy_function => 'auth_orders_sales_pid'); 8 end; 9 / PL/SQL procedure successfully completed.
6.複製依賴物件
SQL> declare 2 num_errors pls_integer; 3 begin 4 dbms_redefinition.copy_table_dependents( 5 uname => 'jy', 6 orig_table => 'orders', 7 int_table => 'int_orders', 8 copy_indexes => dbms_redefinition.cons_orig_params, 9 copy_triggers => true, 10 copy_constraints => true, 11 copy_privileges => true, 12 ignore_errors => true, 13 num_errors => num_errors); 14 end; 15 / PL/SQL procedure successfully completed.
注意在這裡ignore_errors引數被設定為true。原因是因為原始表對於列sales_rep_id存在索引與約束,並且在中間表中列被修改為sales_pid。
7.查詢dba_redefinition_errors檢視來檢查是否存在錯誤
SQL> set long 8000 SQL> set pages 8000 SQL> column object_name heading 'object name' format a20 SQL> column base_table_name heading 'base table name' format a10 SQL> column ddl_txt heading 'ddl that caused error' format a40 SQL> select object_name, base_table_name, ddl_txt from dba_redefinition_errors; no rows selected
8.可選操作同中間表
SQL> begin 2 dbms_redefinition.sync_interim_table( 3 uname => 'jy', 4 orig_table => 'orders', 5 int_table => 'int_orders'); 6 end; 7 / PL/SQL procedure successfully completed.
9.完成聯機重定義操作
SQL> begin 2 dbms_redefinition.finish_redef_table( 3 uname => 'jy', 4 orig_table => 'orders', 5 int_table => 'int_orders'); 6 end; 7 / PL/SQL procedure successfully completed. SQL> desc jy.orders Name Type Nullable Default Comments ------------ --------------------------------- -------- ------- -------- ORDER_ID NUMBER(12) ORDER_DATE TIMESTAMP(6) WITH LOCAL TIME ZONE ORDER_MODE VARCHAR2(8) Y CUSTOMER_ID NUMBER(6) ORDER_STATUS NUMBER(2) Y ORDER_TOTAL NUMBER(8,2) Y SALES_PID NUMBER(6) Y PROMOTION_ID NUMBER(6) Y
10.等待任何查詢中間表的語句執行完成後將其刪除
SQL> drop table jy.int_orders; Table dropped
到此重定義操作就完成了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26015009/viewspace-2142204/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle 12.2 聯機重定義使用VPD策略的表並不修改表的任何列Oracle
- Oracle 12.2 聯機重定義多個分割槽並將其移動到不同的表空間中Oracle
- Oracle 12.2使用物件資料型別來重定義表Oracle物件資料型別
- MySQL修改表的列名MySql
- Oracle使用聯機重定義來給表增加新列與分割槽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
- 【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包線上重定義表
- MySQL 查詢表所有列名,並用逗號分隔MySql
- ORACLE 普通錶轉換成分割槽表(線上重定義)(zt)Oracle
- Oracle的線上重定義(轉)Oracle