如果您正在使用Oracle的企業版,您可以使用Virtual Private Database (VPD)爲此。
VPD允許您進行細粒度的訪問控制(基於用於連接到數據庫的帳戶)。它可以:
- 只返回行的子集
- 使用列屏蔽顯示敏感列作爲NULL值
它通過添加自定義達到這個WHERE子句每查詢在桌子上跑。有沒有辦法來規避它,沒必要以適應現有的應用程序(使用定製視圖等)
要爲您customer
表創建一個VPD,您需要:
- 創建功能產生WHERE子句
- 創建一個策略,爲您的數據庫表
- 啓用該策略
功能
CREATE OR REPLACE FUNCTION hide_address (
v_schema IN VARCHAR2,
v_objname IN VARCHAR2)
RETURN VARCHAR2 AS
result VARCHAR2 (200);
BEGIN
result := '1=0'; -- evaluates to FALSE for every account
RETURN (result);
END hide_address;
創建策略
BEGIN
DBMS_RLS.ADD_POLICY(
object_schema => 'scott',
object_name => 'customer',
policy_name => 'hide_address_policy',
policy_function => 'hide_address',
sec_relevant_cols =>' address',
sec_relevant_cols_opt => dbms_rls.ALL_ROWS);
END;
啓用策略後,每查詢試圖訪問CUSTOMER.ADDRESS將返回NULL 。根據您的要求,您可能要添加視圖訪問返回一個隨機地址,而不是NULL表:
select name,
(case when address is NULL
then dbms_random.string('', 15)
else address end) as address
from
customer
您是否需要此屏蔽只針對某些Oracle帳戶? DBA賬戶是否應該能夠看到原始數據?如果沒有,如果有必要,你打算如何恢復原始數據? –
我需要從生產數據庫中取數據來測試數據庫。但我不採取原始數據。爲此,我必須掩蓋表格的記錄。我不需要恢復到原始數據。 @FrankSchmitt – renis