當我們對一個啟用管理精細審計的表進行導出資料時,會出現如下錯誤:
exp-00079: 表 "purchaseorder" 中的資料是被保護的。正常路徑隻能導出部分表。
. . 正在導出表 purchaseorder導出了 132 行
exp-00079:
使用者在沒有對dbms_rls(存取控制包)的執行權限時,進行了對需要存取控制的表的導出。因為表的所有者也受存取控制權限的限制,是以即使是表的所有者也不能導出整個表的所有行,而隻能導出他所能看到的行。另外,為保證表的一緻性,導出表的使用者必須擁有足夠的權限,以保證在導入時重建表及其安全政策。是以,強烈建議由資料庫管理者來處理導出表的操作。賦予表的所有者以執行權限将有利于這個安全檢查,當然這會引起其他安全沖突.....
一 解決方法
1 以dba的身份導出
c:\users\aaaa>exp '/ as sysdba' wner=oe file=oe.dmp log=oe.log
連接配接到: oracle database 11g enterprise edition release 11.1.0.6.0 - production
with the partitioning, olap, data mining and real application testing options
已導出 zhs16gbk 字元集和 al16utf16 nchar 字元集
即将導出指定的使用者...
. 正在導出 pre-schema 過程對象和操作
. 正在導出使用者 oe 的外部函數庫名
. 導出 public 類型同義詞
. 正在導出專用類型同義詞
. 正在導出使用者 oe 的對象類型定義
即将導出 oe 的對象...
. 正在導出資料庫連結
. 正在導出序号
. 正在導出簇定義
. 即将導出 oe 的表通過正常路徑...
. . 正在導出表 categories_tab導出了 22 行
. . 正在導出表 product_ref_list_nestedtab導出了 288 行
. . 正在導出表 subcategory_ref_list_nestedtab導出了 21 行
. . 正在導出表 customers導出了 319 行
. . 正在導出表 inventories導出了 1112 行
. . 正在導出表 orders導出了 105 行
. . 正在導出表 order_items導出了 665 行
. . 正在導出表 product_descriptions導出了 8640 行
. . 正在導出表 product_information導出了 288 行
. . 正在導出表 promotions導出了 2 行
. . 正在導出表 warehouses導出了 9 行
.......
. 正在導出維
. 正在導出 post-schema 過程對象和操作
. 正在導出統計資訊
成功終止導出, 沒有出現警告。
================================================
c:\users\aaaa>exp system/yang wner=oe file=oe2.dmp log=oe2.log
. 正在導出同義詞
........
導出成功終止, 但出現警告。
2 使用system使用者,使用direct=y 參數 導出資料。但是oe使用者使用direct=y參數導出時依然報錯!
c:\users\aaaa>exp system/yang wner=oe file=oe3.dmp log=oe3.log direct=y
. 即将導出 oe 的表通過直接路徑...
表 categories_tab 将以正常路徑導出。
表 customers 将以正常路徑導出。
表 purchaseorder 将以正常路徑導出。
表 warehouses 将以正常路徑導出。
.........
c:\users\aaaa>exp oe/yang wner=oe file=oe4.dmp log=oe4.log direct=y
exp-00080: 表 "purchaseorder" 中的資料是被保護的。請使用正常模式。
. 正在導出重新整理組和子組
3 賦予使用者exempt access policy 再次導出。當oe 使用者自己導出資料是依然報錯!
c:\users\aaaa>exp oe/yang wner=oe file=oe3.dmp log=oe3.log
export: release 11.1.0.6.0 - production on 星期日 2月 20 21:08:14 2011
sys@oracl> grant exempt access policy to oe;
====================================
二 如何确定導出的資料是否完整
以dba身份執行如下查詢并對比導出日志中的行數,是否相等。
sys@oracl> select count(*) from oe.purchaseorder;
count(*)
----------
132
查詢某些表是否啟動了管理精細審計
sys@oracl> select enable,sel,object_owner||'.'||object_name "object_owner.name"
2 from dba_policies where object_name='purchaseorder';
ena sel object_owner.name
--- --- -------------------------------------------------------------
yes no oe.purchaseorder
yes yes oe.purchaseorder
sys@oracl> desc dba_policies