2011-09-20 167 views
2

在我的oracle數據庫中,我有一個名爲test的用戶,該用戶在數據庫中有DML_ROLE。並且,我在名爲hdr_detail的表上提供了對DML_ROLE的插入/更新/刪除/選擇訪問。Oracle 11G中的用戶訪問問題

但是,當用戶testhdr_detail表執行更新查詢時,其獲取的錯誤消息爲Returned error: ORA-01031: insufficient privileges。當我直接向用戶提供訪問時,它工作正常。

我很困惑,爲什麼這個錯誤只有當我通過角色提供訪問時才顯示出來。

表結構:

COLUMN NAME   DATA TYPE 
PERIOD    NUMBER 
HDR_ID    VARCHAR2(50) 

查詢我使用來更新:

update test_sch.hdr_detail set period=201108 where hdr_id = 'check'; 

聲明我使用授予:

grant insert,select,update,delete on test_sch.hdr_detail to dml_role; 

select * from dba_role_privs where grantee like 'TEST'返回以下結果

GRANTEE GRANTED_ROLE ADMIN_OPTION DEFAULT_ROLE 
TEST DML_ROLE  NO   NO 

select * from dba_tab_privs where table_name like 'HDR_DETAIL'返回以下結果

GRANTEE OWNER  TABLE_NAME GRANTOR  PRIVILEGE GRANTABLE HIERARCHY 
DML_ROLE TEST_SCH HDR_DETAIL TEST_SCH DELETE  NO   NO 
DML_ROLE TEST_SCH HDR_DETAIL TEST_SCH INSERT  NO   NO 
DML_ROLE TEST_SCH HDR_DETAIL TEST_SCH SELECT  NO   NO 
DML_ROLE TEST_SCH HDR_DETAIL TEST_SCH UPDATE  NO   NO 

請幫我解決這個問題。如果需要更多關於此問題的信息,請回複評論。

+0

如何被用戶attemptign做出更新?直接通過SQL * Plus或類似的界面或通過應用程序? – Ollie

+1

數據庫中是否有任何公共同義詞,如hdr_detail?可能你的用戶看到另一個表。 –

+1

這張桌子上是否有觸發器? – Ollie

回答

2

嘗試將角色爲用戶默認角色:

ALTER USER test DEFAULT ROLE dml_role; 
0

這可能是您如何訪問數據庫對象HDR_DETAIL的問題。

距離Don伯利森(http://www.dba-oracle.com/concepts/roles_security.htm):

Oracle roles have some limitations. In particular object privileges are granted through Oracle roles can not be used when writing PL/SQL code. When writing PL/SQL code, you must have direct grants to the objects in the database that your code is accessing.

如果用戶通過應用程序或PL/SQL塊發出UPDATE然後它不會使用基於角色的權限。如果是這種情況,您將不得不直接授予權限。

+0

編號用戶僅通過sql * plus執行。它是一個正常的SQL語句「Update hdr_detail set = 」 – Vivek

+2

嘗試將角色設置爲用戶默認角色:ALTER USER test DEFAULT ROLE dml_role; – Ollie

+1

@Ollie:看起來你正在混合_writing PL/SQL code_和_executing PL/SQL code_。 PL/SQL代碼通常與定義者的權限一起執行。 – Codo

0

這似乎是不可能的。 您確定您的用戶連接到正確的數據庫,架構並查詢了正確的表嗎? 我驚呆了。

請嘗試

select * from test_sch.hdr_detail 
室內用

測試用戶。