1.初始化環境
構造表T,其中包含一個欄位X。
sec@ora10g> create table t (x number);
sec@ora10g> insert into t values (1);
sec@ora10g> insert into t values (2);
sec@ora10g> insert into t values (10001);
sec@ora10g> insert into t values (10002);
sec@ora10g> commit;
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
2.問題情境描述
禁止查詢T表中X列值大於10000的資料。
3.實現方法一:使用視圖
這種方法可能是大家都很容易想到的,實現起來相對簡單。但無法真正做到禁止訪問基礎資料表。
sec@ora10g> create view v_t as select * from t where x <=10000;
View created.
sec@ora10g> select * from v_t;
X
----------
1
2
此時如果直接查詢基礎資料表t,仍然可以獲得說有的資料。
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
4.實現方法二:使用VPD
1)建立VPD需要的函數,這裡給出的名字是f_limited_query_t。
CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,
s_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'X <= 10000';
END;
/