Oracle實(shí)現(xiàn)細(xì)粒度訪(fǎng)問(wèn)控制的步驟
細(xì)粒度訪(fǎng)問(wèn)控制(Fine-Grained Access Control, FGAC)是Oracle數(shù)據(jù)庫(kù)中用于提供行級(jí)和列級(jí)安全控制的強(qiáng)大功能。通過(guò)FGAC,數(shù)據(jù)庫(kù)管理員可以基于用戶(hù)身份、會(huì)話(huà)屬性或其他上下文信息,動(dòng)態(tài)地控制對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的訪(fǎng)問(wèn)。
實(shí)現(xiàn)細(xì)粒度訪(fǎng)問(wèn)控制的步驟
- 創(chuàng)建策略函數(shù)
- 創(chuàng)建并應(yīng)用策略
- 驗(yàn)證細(xì)粒度訪(fǎng)問(wèn)控制
詳細(xì)步驟和代碼示例
假設(shè)我們有一個(gè)示例表employees,包含以下列:employee_id, name, department_id, salary。
1. 創(chuàng)建策略函數(shù)
策略函數(shù)是一個(gè)PL/SQL函數(shù),它返回一個(gè)WHERE子句,用于限制用戶(hù)對(duì)數(shù)據(jù)的訪(fǎng)問(wèn)。在這個(gè)示例中,我們將基于用戶(hù)的部門(mén)ID來(lái)限制用戶(hù)只能看到其所在部門(mén)的員工記錄。
-- 連接到數(shù)據(jù)庫(kù) sqlplus sys as sysdba -- 切換到HR模式 ALTER SESSION SET CURRENT_SCHEMA = hr; -- 創(chuàng)建策略函數(shù) CREATE OR REPLACE FUNCTION emp_dept_policy (schema_name IN VARCHAR2, object_name IN VARCHAR2) RETURN VARCHAR2 AS v_predicate VARCHAR2(4000); BEGIN -- 獲取當(dāng)前用戶(hù)的部門(mén)ID v_predicate := 'department_id = (SELECT department_id FROM users WHERE username = USER)'; RETURN v_predicate; END; /
在這個(gè)示例中,策略函數(shù)emp_dept_policy返回一個(gè)WHERE子句,將用戶(hù)只能看到其所在部門(mén)的員工記錄。
2. 創(chuàng)建并應(yīng)用策略
接下來(lái),我們需要?jiǎng)?chuàng)建一個(gè)策略并將其應(yīng)用到employees表上。
-- 使用DBMS_RLS包創(chuàng)建并應(yīng)用策略
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'emp_dept_policy',
function_schema => 'hr',
policy_function => 'emp_dept_policy',
statement_types => 'SELECT, INSERT, UPDATE, DELETE'
);
END;
/
在這個(gè)示例中,我們使用DBMS_RLS.ADD_POLICY過(guò)程將策略函數(shù)emp_dept_policy應(yīng)用到employees表上,以控制SELECT、INSERT、UPDATE和DELETE操作。
3. 驗(yàn)證細(xì)粒度訪(fǎng)問(wèn)控制
現(xiàn)在,我們可以驗(yàn)證細(xì)粒度訪(fǎng)問(wèn)控制是否生效。假設(shè)我們有兩個(gè)用戶(hù):user1和user2,分別屬于不同的部門(mén)。
-- 創(chuàng)建示例用戶(hù)并授予權(quán)限
CREATE USER user1 IDENTIFIED BY password;
CREATE USER user2 IDENTIFIED BY password;
GRANT CONNECT TO user1;
GRANT CONNECT TO user2;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO user1;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO user2;
-- 插入一些示例數(shù)據(jù)
INSERT INTO hr.employees (employee_id, name, department_id, salary) VALUES (1, 'Alice', 10, 50000);
INSERT INTO hr.employees (employee_id, name, department_id, salary) VALUES (2, 'Bob', 20, 60000);
INSERT INTO hr.employees (employee_id, name, department_id, salary) VALUES (3, 'Charlie', 10, 55000);
INSERT INTO hr.users (username, department_id) VALUES ('USER1', 10);
INSERT INTO hr.users (username, department_id) VALUES ('USER2', 20);
COMMIT;
-- 以u(píng)ser1身份連接數(shù)據(jù)庫(kù)并查詢(xún)employees表
sqlplus user1/password@database
SELECT * FROM hr.employees;
-- 以u(píng)ser2身份連接數(shù)據(jù)庫(kù)并查詢(xún)employees表
sqlplus user2/password@database
SELECT * FROM hr.employees;
當(dāng)user1查詢(xún)employees表時(shí),應(yīng)該只能看到部門(mén)ID為10的員工記錄。同樣,當(dāng)user2查詢(xún)employees表時(shí),應(yīng)該只能看到部門(mén)ID為20的員工記錄。
示例腳本
以下是一個(gè)完整的示例腳本,展示如何配置和使用細(xì)粒度訪(fǎng)問(wèn)控制。
-- 連接到數(shù)據(jù)庫(kù)
sqlplus sys as sysdba
-- 切換到HR模式
ALTER SESSION SET CURRENT_SCHEMA = hr;
-- 創(chuàng)建示例表和用戶(hù)表
CREATE TABLE hr.employees (
employee_id NUMBER PRIMARY KEY,
name VARCHAR2(100),
department_id NUMBER,
salary NUMBER
);
CREATE TABLE hr.users (
username VARCHAR2(30) PRIMARY KEY,
department_id NUMBER
);
-- 插入一些示例數(shù)據(jù)
INSERT INTO hr.employees (employee_id, name, department_id, salary) VALUES (1, 'Alice', 10, 50000);
INSERT INTO hr.employees (employee_id, name, department_id, salary) VALUES (2, 'Bob', 20, 60000);
INSERT INTO hr.employees (employee_id, name, department_id, salary) VALUES (3, 'Charlie', 10, 55000);
INSERT INTO hr.users (username, department_id) VALUES ('USER1', 10);
INSERT INTO hr.users (username, department_id) VALUES ('USER2', 20);
COMMIT;
-- 創(chuàng)建策略函數(shù)
CREATE OR REPLACE FUNCTION hr.emp_dept_policy (schema_name IN VARCHAR2, object_name IN VARCHAR2)
RETURN VARCHAR2
AS
v_predicate VARCHAR2(4000);
BEGIN
-- 獲取當(dāng)前用戶(hù)的部門(mén)ID
v_predicate := 'department_id = (SELECT department_id FROM hr.users WHERE username = USER)';
RETURN v_predicate;
END;
/
-- 使用DBMS_RLS包創(chuàng)建并應(yīng)用策略
BEGIN
DBMS_RLS.ADD_POLICY (
object_schema => 'hr',
object_name => 'employees',
policy_name => 'emp_dept_policy',
function_schema => 'hr',
policy_function => 'emp_dept_policy',
statement_types => 'SELECT, INSERT, UPDATE, DELETE'
);
END;
/
-- 創(chuàng)建用戶(hù)并授予權(quán)限
CREATE USER user1 IDENTIFIED BY password;
CREATE USER user2 IDENTIFIED BY password;
GRANT CONNECT TO user1;
GRANT CONNECT TO user2;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO user1;
GRANT SELECT, INSERT, UPDATE, DELETE ON hr.employees TO user2;
-- 以u(píng)ser1身份連接數(shù)據(jù)庫(kù)并查詢(xún)employees表
sqlplus user1/password@database
SELECT * FROM hr.employees;
-- 以u(píng)ser2身份連接數(shù)據(jù)庫(kù)并查詢(xún)employees表
sqlplus user2/password@database
SELECT * FROM hr.employees;
總結(jié)
細(xì)粒度訪(fǎng)問(wèn)控制(Fine-Grained Access Control, FGAC)是Oracle數(shù)據(jù)庫(kù)中用于提供行級(jí)和列級(jí)安全控制的強(qiáng)大功能。通過(guò)創(chuàng)建策略函數(shù)和策略,可以基于用戶(hù)身份、會(huì)話(huà)屬性或其他上下文信息,動(dòng)態(tài)地控制對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)的訪(fǎng)問(wèn)。上述步驟和代碼示例展示了如何配置和使用細(xì)粒度訪(fǎng)問(wèn)控制,以滿(mǎn)足具體的業(yè)務(wù)需求。
以上就是Oracle實(shí)現(xiàn)細(xì)粒度訪(fǎng)問(wèn)控制的步驟的詳細(xì)內(nèi)容,更多關(guān)于Oracle細(xì)粒度訪(fǎng)問(wèn)控制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Oracle19c最新版保姆級(jí)別最詳細(xì)的安裝配置教程(2023年)
這篇文章主要給大家介紹了關(guān)于Oracle19c最新版保姆級(jí)別安裝配置教程的相關(guān)資料,19c作為原有序列的12c最后一個(gè)版本,可以說(shuō)是集大成的版本,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-07-07
Oracle數(shù)據(jù)庫(kù)升級(jí)或數(shù)據(jù)遷移方法研究
本文詳細(xì)論述了oracle數(shù)據(jù)庫(kù)升級(jí)的升級(jí)前的準(zhǔn)備、升級(jí)過(guò)程和升級(jí)后的測(cè)試與調(diào)整工作,并對(duì)各種升級(jí)方法在多種操作系統(tǒng)平臺(tái)上作了測(cè)試。2016-07-07
使用Navicat Premium連接Oracle的方法步驟
這篇文章主要介紹了使用Navicat Premium連接Oracle的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
Oracle?exadata存儲(chǔ)節(jié)點(diǎn)更換內(nèi)存操作及報(bào)錯(cuò)處理方法
在進(jìn)行Oracle?Exadata巡檢時(shí),發(fā)現(xiàn)cell節(jié)點(diǎn)內(nèi)存報(bào)錯(cuò),需確認(rèn)內(nèi)存PN號(hào)及大小,并更換備件,這篇文章主要介紹了Oracle?exadata存儲(chǔ)節(jié)點(diǎn)更換內(nèi)存操作及報(bào)錯(cuò)處理的相關(guān)資料,需要的朋友可以參考下2024-10-10
dbeaver無(wú)法連接Oracle報(bào)錯(cuò):?ORA-17800、ORA-12514解決辦法
ORA-12170是Oracle數(shù)據(jù)庫(kù)常見(jiàn)的網(wǎng)絡(luò)連接錯(cuò)誤之一,通常表示客戶(hù)端無(wú)法在指定的時(shí)間內(nèi)完成與服務(wù)器的連接,這篇文章主要介紹了dbeaver無(wú)法連接Oracle報(bào)錯(cuò):?ORA-17800、ORA-12514的解決辦法,需要的朋友可以參考下2025-11-11
oracle執(zhí)行update語(yǔ)句時(shí)卡住問(wèn)題分析及解決辦法
這篇文章主要介紹了oracle執(zhí)行update語(yǔ)句時(shí)卡住問(wèn)題分析及解決辦法,涉及記錄鎖等相關(guān)知識(shí),具有一定參考價(jià)值,需要的朋友可以了解。2017-10-10
對(duì)比Oracle臨時(shí)表和SQL Server臨時(shí)表的不同點(diǎn)
這篇文章主要介紹了Oracle數(shù)據(jù)庫(kù)建立臨時(shí)表的相關(guān)知識(shí)以及和SQL Server臨時(shí)表的不同點(diǎn)的對(duì)比,希望能夠?qū)δ兴鶐椭?/div> 2015-09-09
Oracle數(shù)據(jù)庫(kù)AWR報(bào)告的生成步驟與分析方法
本文介紹了在Oracle數(shù)據(jù)庫(kù)中生成AWR報(bào)告的基本步驟和方法,以及分析AWR報(bào)告的五步法:1 看整體負(fù)載;2 查看等待事件;3 了解SQL統(tǒng)計(jì);4 調(diào)查時(shí)間模型;5 分析操作系統(tǒng)和內(nèi)存,需要的朋友可以參考下2026-04-04
oracle導(dǎo)出sql語(yǔ)句的結(jié)果集和保存執(zhí)行的sql語(yǔ)句(深入分析)
本篇文章是對(duì)oracle導(dǎo)出sql語(yǔ)句的結(jié)果集與保存執(zhí)行的sql語(yǔ)句進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05最新評(píng)論

