利用FGAC/VPD重寫使用者SQL
FGAC/VPD可以從安全方面限制使用者在行級別的訪問許可權,對於安全性考慮的應用有很大幫助。
另外,在一些特別特殊的情況下,可以透過它改寫使用者SQL的謂詞(where condition)。
這裡step by step做一個例子,以供以後參考。
SQL> show user
USER is "HAOZHU_USER"
SQL> create table testfgac as select * from dba_tables;
Table created.
1.建立一個context用來標示你希望標示的屬性。
這裡我用my_role來代表當前使用者是否是我定義的“DB_OWNER”
SQL> create context hao_context using hao_package;
Context created.
SQL> create or replace procedure hao_package
( my_role in varchar2)
as
begin
dbms_session.set_context (
'HAO_CONTEXT',
'MY_ROLE',
my_role
);
end;
Procedure created.
2.建立一個login trigger,如果當前使用者是'HAO',那麼設立它的role是DB_OWNER.
SQL> create or replace trigger hao_ctx_trig
after logon on database
declare
my_role varchar2(50);
begin
select decode(sys_context('USERENV','SESSION_USER'),'HAO',
'DB_OWNER','NOT_DB_OWNER')
into my_role from dual;
hao_package(my_role);
exception
when NO_DATA_FOUND then
null;
when OTHERS then
raise;
end;
Trigger created.
3.檢視login trigger生效沒有
SQL> show user
USER is "SYS"
SQL> select sys_context('HAO_CONTEXT','MY_ROLE') myrole from dual;
MYROLE
--------------------
NOT_DB_OWNER
SQL> conn hao/hao
Connected.
SQL> select sys_context('HAO_CONTEXT','MY_ROLE') myrole from dual;
MYROLE
--------------------
DB_OWNER
4.最重要的一步,建立一個function用來作為返回你想修改的謂詞。
SQL> create or replace function hao_secure
(my_owner in varchar2,
my_obj in varchar2)
return varchar2
as
ret varchar2(2000);
begin
select decode(sys_context('HAO_CONTEXT','MY_ROLE'),'DB_OWNER',null,'LAST_ANALYZED<=sysdate-1') into ret from dual;
return ret;
end;
Function created.
5.加上policy,對dml語句和select都生效
SQL> begin
dbms_rls.add_policy (
OBJECT_SCHEMA => 'HAOZHU_USER',
object_name => 'TESTFGAC',
policy_name => 'my_p',
policy_function => 'HAO_SECURE',
statement_types => 'INSERT, UPDATE, DELETE, SELECT',
update_check => TRUE
);
end;
/
PL/SQL procedure successfully completed.
6.測試
SQL> conn hao/hao
Connected.
SQL> select sys_context('HAO_CONTEXT','MY_ROLE') myrole from dual;
MYROLE
-------------------------
DB_OWNER
SQL> select count(*) from HAOZHU_USER.TESTFGAC;
COUNT(*)
----------
1043
SQL> conn another_user/another_user
Connected.
SQL> select count(*) from HAOZHU_USER.TESTFGAC;
COUNT(*)
----------
934
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15415488/viewspace-618367/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用ORACLE VPD實現使用者安全控制Oracle
- 利用sql語句找出表中有重複記錄的三種sql寫法SQL
- 【VPD】使用Oracle VPD(Virtual Private Database)限制使用者獲取資料的範圍OracleDatabase
- 利用SQL Server的全域性臨時表防止使用者重複登入 (轉)SQLServer
- 利用Oracle VPD實現行級安全保護(二)Oracle
- 利用Oracle VPD實現行級安全保護(一)Oracle
- oracle之FGAC(Fine Grainted Access)OracleAI
- 利用apache的mod_rewrite做URL規則重寫Apache
- 利用VPD細粒度訪問策略實現行級安全性
- ORACLE VPD方案Oracle
- vpd contextContext
- ORACLE VPD AND FGAOracle
- 標準SQL寫法的重複列問題SQL
- 利用VPD細粒度訪問策略實現行級安全性 Step By Step
- oracle VPD介紹Oracle
- ORACLE FGAC(細粒度許可權控制)(轉)Oracle
- 刪除重複資料的三種sql寫法SQL
- sql改寫優化:簡單規則重組實現SQL優化
- 重寫Reddit
- 方法重寫
- sql 去重SQL
- 【SQL】Oracle查詢轉換之物化檢視查詢重寫SQLOracle
- Oracle 12.2 聯機重定義使用VPD策略的表並修改表的列名Oracle
- 為什麼重寫equals必須重寫hashCode
- 利用釦子(coz)API自動重寫課件PPT網頁標題和正文API網頁
- 重寫ThreadPoolTaskExecutorthread
- hashcode重寫
- Strangler重寫模式模式
- nginx url重寫Nginx
- 查詢重寫
- Nginx 重寫URINginx
- C++重寫C++
- MySQL 去重SQLMySql
- [譯] 如何使用 Pandas 重寫你的 SQL 查詢以及其他操作SQL
- 重寫equals()方法時,需要同時重寫hashCode()方法
- sql改寫SQL
- 利用rownum分組排序去重排序
- Oracle vs PostgreSQL DBA(21)- Oracle VPDOracleSQL