編譯 Trigger 出錯,錯誤的原因是找不到sequence,但是在 sql 里面使用這個sequence非常正常。找了半天原因,另一個同事試了一下給這個sequence授權(quán),就可以編譯通過了。
疑惑了很久,為什么sql中可以用,編譯trigger就不能用了呢。
查了一些資料,才明白。
是因為 Oracle 在編譯Procedu的時候,只檢查當(dāng)前用戶的權(quán)限,而不管角色。所以,即使這個用戶是DBA,也沒有用,必須要對這個用戶授權(quán)。這就是顯式授權(quán)。
我在CSDN上找到了一個很好的文章,解釋了顯式授權(quán)和隱式授權(quán)的區(qū)別。
附在下面。
來自CSDN博客,http://blog.csdn.net/pashine/archive/2009/12/21/5050060.aspx
oracle 對象的授權(quán)
Oracle授權(quán)
一、授權(quán)語法
GRANT 語法:
1.顯式授權(quán)(直接將對象授權(quán)給用戶)
GRANT privilege [, ...] ON object [, ...] TO { Public| Group | Username|role} [WITH GRANT OPTION ]
2.隱式授權(quán)(通過將角色授權(quán)給用戶)
GRANT role TO { Public| Group | Username|role}
語法說明:
privilege (權(quán)限)
可能的權(quán)限有:
SELECT--訪問聲明的表/視圖的所有列/字段.
INSERT--向聲明的表中插入所有列字段.
UPDATE--更新聲明的所有列/字段.
DELETE --從聲明的表中刪除所有行.
RULE 在表/視圖上定義規(guī)則 (參見 CREATE RULE 語句).
ALL 賦予所有權(quán)限.
object 賦予權(quán)限的對象名.
可能的對象是:
table (表)
view (視圖)
sequence (序列)
index (索引)
Public 代表是所有用戶的簡寫.
Group 將要賦予權(quán)限的組GROUP .目前的版本中,組必須是用下面方法顯式創(chuàng)建的.
Username 將要賦予權(quán)限的用戶名.PUBLIC 是代表所有用戶的簡寫.
role 某個角色,(如DBA)
WITH GRANT OPTION 允許向別人賦予同樣權(quán)限,被授權(quán)的用戶可以繼續(xù)授權(quán).
描述
對象創(chuàng)建后,除了創(chuàng)建者外,除非創(chuàng)建者賦予(GRANT)權(quán)限,其他人沒有訪問對象的權(quán)限。
GRANT 允許對象的創(chuàng)建者給某用戶或某組或所有用戶(PUBLIC)某些特定的權(quán)限。不需要給創(chuàng)建者賦予(GRANT)對象的權(quán)限,創(chuàng)建者自動擁有對象的所有權(quán)限,包括刪除它的權(quán)限。
說明
Oracle不允許在過程中使用未經(jīng)顯式授權(quán)的對象. 要使用另一用戶的對象,必須通過另一用戶給自己顯示授權(quán)。
因為Oracle在編譯存儲過程時并不檢查定義者擁有的角色,只是檢查其被顯式授予的權(quán)限,而DBA也是一種角色,所以即使是DBA,也需要顯式授權(quán)。
二、授權(quán)方式 (顯式和隱式)
對象授權(quán)有兩種模式,顯式和隱式:
顯示授權(quán)和隱式授權(quán)的區(qū)別是:顯示授權(quán)是直接把對象授權(quán)給用戶,隱式授權(quán)是給用戶授予角色的方式來實現(xiàn)授權(quán)。
1. 顯式授權(quán)是直接用GRANT語句進行授權(quán)。
語法:GRANT 某種權(quán)限 TO 用戶
如:
CONN USER1/Password
GRANT SELECT ON TABLE1 TO USER2; --- 將user1的表TABLE1的select 權(quán)限顯示授權(quán)給user2
GRANT UPDATE ON TABLE1 TO USER2; --- 將user1的表TABLE1的update權(quán)限顯示授權(quán)給user2
注:用system/manager登錄是沒法授權(quán)的,要使USER2用戶能在存儲過程里面訪問USER1用戶的表,必須以USER1用戶(該用戶有dba權(quán)限)登錄,然后授權(quán)就可以了。
SQL>grant select on USER1.MA_USERINFO to USER2
2.隱式授權(quán)則是通過ROLE來授權(quán)。
語法:GRANT 某個角色 TO 用戶
如:
CONN USER1
GRANT SELECT ON TABLE1 TO ROLE1; --- 將USER1的表TABLE1的select權(quán)限顯示授權(quán)給Role1
CONN SYSTEM
GRANT ROLE1 TO USER2; --- 給USER2授與Role1的權(quán)限。
三、收回權(quán)限
語法:
revoke 權(quán)限 from 用戶;
例子:
revoke select on table1 from User1; 收回查詢select表的權(quán)限;
revoke all on table1 from User1;
grant connect to xujin;
revoke connect from xujin
revoke ROLE1 from USER2;
End
posted on 2010-03-05 11:25
哈哈的日子 閱讀(1141)
評論(0) 編輯 收藏