了解Oracle存儲(chǔ)過程中的角色
2024-08-29 13:33:19
供稿:網(wǎng)友
角色(數(shù)據(jù)庫(kù)權(quán)限集)與存儲(chǔ)過程、函數(shù)和數(shù)據(jù)包之間的交互方式是Oracle安全模型中最難以處理的一個(gè)部分。Oracle中的對(duì)象權(quán)限可以直接或通過角色間接授予用戶。 假設(shè)一個(gè)HR用戶向用戶ABEL授予EMPLOYEES表的一些許可: GRANT select, insert, update, delete 這個(gè)語(yǔ)句直接把上述四個(gè)權(quán)限授予給用戶ABEL。另一方面,假設(shè)一名HR用戶這樣做:GRANT select, insert, update, delete ON employees TO hr_role; 假如ABEL已被授予HR_ROLE角色,那么他現(xiàn)在通過這個(gè)角色就直接擁有了以上權(quán)限。 不管使用哪種方法,現(xiàn)在ABEL都擁有了HR.EMPLOYEES表的SELECT權(quán)限。假如ABEL通過SELECT語(yǔ)句直接從表中選擇數(shù)據(jù),那么他如何獲得許可并不重要。 但是,假如ABEL試圖建立從這個(gè)表中選擇的存儲(chǔ)過程、函數(shù)或數(shù)據(jù)包,那么他是直接獲得許可,還是通過角色取得許可就存在很大差異。 Oracle要求直接向用戶授予一個(gè)存儲(chǔ)過程中的非擁有對(duì)象許可。在編輯過程中角色被臨時(shí)關(guān)閉,用戶不能訪問授予給他們的任何內(nèi)容。這樣做是出于性能和安全考慮。 角色可以通過SET ROLE命令動(dòng)態(tài)激活和禁用,假如Oracle需要不斷檢查哪個(gè)角色和許可當(dāng)前處于激活狀態(tài),則會(huì)帶來(lái)巨大的治理負(fù)擔(dān)。 下面的代碼是一個(gè)更新HR雇員文件的簡(jiǎn)短存儲(chǔ)過程(這段代碼用一個(gè)同義字EMPLOYEES來(lái)代表HR.EMPLOYEES)。當(dāng)ABEL在第一種情況下試圖用直接權(quán)限編輯這個(gè)文件時(shí),編輯取得成功;當(dāng)他在第二種情況下僅用間接權(quán)限編輯時(shí),編輯失敗。CREATE OR REPLACE PROCEDURE update_emp (p_employee_id IN NUMBER,p_salary IN NUMBER)ASv_department_idemployees.department_id%TYPE;BEGINSELECT department_id INTO v_department_idFROM employeesWHERE employee_id = p_employee_id;UPDATE employeesSET salary = p_salaryWHERE employee_id = p_employee_id;IF v_department_id = 100 THENUPDATE local_employeesSET salary = p_salaryWHERE employee_id = p_employee_id;END IF;END;/ 有趣的是,向PUBLIC授予許可和直接授予所有用戶許可相同。PUBLIC常被認(rèn)為是一個(gè)角色,但它并不是一個(gè)角色。它是一個(gè)用戶集而不是一個(gè)許可集。假如向PUBLIC授權(quán)HR.EMPLOYEES的許可,ABEL將能夠建立他自己的存儲(chǔ)過程。雖然在EMPLOYEES表中我們不推薦這樣做,但任何授予給PUBLIC的表都可以自由地在存儲(chǔ)過程中應(yīng)用。