4 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
這是oracle的an quan 機(jī)制,在存儲(chǔ)過(guò)程或者函數(shù)中調(diào)用其他用戶下的過(guò)程、表、函數(shù)等 一定要顯式fu quan才可以,利用角色fu quan是不可以的。
因此:
為什么我在B用戶下查詢A用戶的表,用sql語(yǔ)句可以直接查
===這個(gè)是角色fu quan導(dǎo)致的,比如B用戶有數(shù)據(jù)庫(kù)管理員角色

TA貢獻(xiàn)1752條經(jīng)驗(yàn) 獲得超4個(gè)贊
1、把這個(gè)函數(shù)的訪問(wèn)權(quán)限付給其它用戶。grant execute on 函數(shù)名 to 其它用戶。
其它用戶調(diào)用函數(shù)時(shí),前面要加上創(chuàng)建用戶名 如:a創(chuàng)建函數(shù) getFunction 。 b調(diào)用的時(shí)候?yàn)閍.getFunction.
2、可以把函數(shù)建成全局函數(shù)。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超13個(gè)贊
同一個(gè)包,在相同的用戶下的匿名程序塊中可以執(zhí)行,但是在存儲(chǔ)過(guò)程中卻沒(méi)有權(quán)限執(zhí)行,查了下資料,一些DBMS_開頭的pkg在pl/sql中用到的時(shí)候,需要顯示的執(zhí)行
grant execute on dbms_xxxx to xxx 來(lái)賦下權(quán)限才可以。此外這個(gè)授權(quán)system用戶是沒(méi)有權(quán)限的,要sys 或者plsql / as dba登錄才有權(quán)限授權(quán)。
授權(quán)以后可以看到:
SYSTEM@RACTEST> select grantee,owner,table_name,grantor,privilege from dba_tab_privs where table_name like 'DBMS_LOCK';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE
-------------------- ---------- ---------- ---------- ----------
EXECUTE_CATALOG_ROLE SYS DBMS_LOCK SYS EXECUTE
DMSYS SYS DBMS_LOCK SYS EXECUTE
CTXSYS SYS DBMS_LOCK SYS EXECUTE
EXFSYS SYS DBMS_LOCK SYS EXECUTE
MDSYS SYS DBMS_LOCK SYS EXECUTE
OLAPSYS SYS DBMS_LOCK SYS EXECUTE
SYSMAN SYS DBMS_LOCK SYS EXECUTE
ETL SYS DBMS_LOCK SYS EXECUTE
8 rows selected.
然后再次執(zhí)行:
SYSTEM@RACTEST> CREATE OR REPLACE PROCEDURE etl.pliutest
2 authid current_user
3 AS
4 BEGIN
5 DBMS_LOCK.sleep(1);
6 END;
7 /
Procedure created.
OK了!

TA貢獻(xiàn)1783條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是oracle的an quan 機(jī)制,在存儲(chǔ)過(guò)程或者函數(shù)中調(diào)用其他用戶下的過(guò)程、表、函數(shù)等 一定要顯式fu quan才可以,利用角色fu quan是不可以的。
因此:
為什么我在B用戶下查詢A用戶的表,用sql語(yǔ)句可以直接查
===這個(gè)是角色fu quan導(dǎo)致的,比如B用戶有數(shù)據(jù)庫(kù)管理員角色
添加回答
舉報(bào)